【发布时间】:2018-11-19 17:06:12
【问题描述】:
我有一个基本接口,以及一个在构造函数中实现它的类,然后根据输入顺序或并行获取一些数据。
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;
}
}
然后我有测试:
[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);
}
还有问题:
NotParallel 结果始终相同(30),但在并行情况下,结果会有所不同(有时为 15,有时为 21 等)。 可能是什么问题?如何解决这个问题?
【问题讨论】:
标签: c# .net unit-testing mocking moq