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。 以下是如何使此线程安全的一些选项: