C# 单元测试 Parallel.Foreach

9

我一直在使用JustMock进行C#单元测试。

我面临的问题是,在Parallel.Foreach中调用的函数无法进行断言。但是其中执行的赋值可以进行断言。

Parallel.ForEach(aList, entity =>
{
    //Can be asserted using  Assert(5,parameter.value) in the test
    parameter.value = 5;

    //Cannot be asserted, assertion fails Mock.Assert(parameter) in the test
    //is arranged using MustBeCalled
    parameter.call();   
})

我在其他测试案例中也发现了相同的问题。这是JustMock的一些错误行为吗?

2
把这个问题问给Telerik帮助台不是更合理吗? - lokusking
你还做了哪些测试? - Neil
尝试移除Parallel,改为普通的foreach。 - Azhar Khorasany
1
从技术上讲,如果您打算从Parallel循环内部修改定义在外部的变量,则应锁定该变量。这可以确保线程同步。如果您将5更改为某个随机数生成器的结果,则可能会看到这一点。 - Rick the Scapegoat
只有在第一个线程中,排列好的函数才会被模拟。 - Sunny
1个回答

3

在进行并行处理时,你不能轻易地假设某件事情会或不会发生,这就使得它更加困难。相反,你要集中注意力于能够告诉你某些事情正在进行的迹象。问题在于,Parallel.ForEach 一旦发现异常就会停止处理,而你原本期望它会处理所有项。你的 JustMock 没有问题。使用普通的 foreach 应该可以解决这个问题。如果你仍然需要使用 Parallel.Foreach,请尝试在此处捕获所有异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接