C# 基于moq的并行函数单元测试
我有一个基本接口,一个类在构造函数中实现它,然后根据输入顺序或并行地获取一些数据C# 基于moq的并行函数单元测试,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,我有一个基本接口,一个类在构造函数中实现它,然后根据输入顺序或并行地获取一些数据 public interface ISomeService { List<int> FetchSomeData(int a); } public class SomeClass { private ISomeService sr { get; } public SomeClass(ISomeServi
public interface ISomeService
{
List<int> FetchSomeData(int a);
}
public class SomeClass
{
private ISomeService sr { get; }
public SomeClass(ISomeService sr) => this.sr = sr;
public int DoMagic(bool paralell)
{
int sum = 0;
if (paralell)
{
Parallel.For(0, 10, (x) =>
{
sum += sr.FetchSomeData(x).Sum(z => z);
});
}
else
{
for (int i = 0; i < 10; i++)
{
sum += sr.FetchSomeData(i).Sum(z => z);
}
}
return sum;
}
}
公共接口服务
{
列表获取数据(INTA);
}
公共类
{
私有服务sr{get;}
公共SomeClass(ISomeService sr)=>this.sr=sr;
公共区域(布尔并行)
{
整数和=0;
如果(平行)
{
对于(0,10,(x)=>
{
sum+=sr.FetchSomeData(x).sum(z=>z);
});
}
其他的
{
对于(int i=0;i<10;i++)
{
sum+=sr.FetchSomeData(i).sum(z=>z);
}
}
回报金额;
}
}
然后我有一个测试:
[Test]
public void DoTest()
{
var service = new Mock<ISomeService>(MockBehavior.Strict);
service.Setup(x => x.FetchSomeData(It.IsAny<int>()))
.Returns(() => new List<int> { 3 });
var someClass = new SomeClass(service.Object);
var notParallel = someClass.DoMagic(false);
var parallel = someClass.DoMagic(true);
Assert.AreEqual(30, notParallel);
Assert.AreEqual(30, parallel);
}
[测试]
公共空间DoTest()
{
var service=newmock(MockBehavior.Strict);
service.Setup(x=>x.FetchSomeData(It.IsAny()))
.Returns(()=>新列表{3});
var someClass=新的someClass(service.Object);
var notParallel=someClass.DoMagic(false);
var parallel=someClass.DoMagic(true);
断言。相等(30,不平行);
AreEqual(30,平行);
}
问题是:
非平行结果总是相同的(30),但在平行情况下,结果会有所不同(有时15,其他时间21等)。
有什么问题吗?如何解决这个问题 您正在从多个线程更新变量sum。 以下是如何使此线程安全的一些选项: