【问题标题】:Unit testing parallel function using moq使用最小起订量对并行功能进行单元测试
【发布时间】: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


    【解决方案1】:

    您正在从多个线程更新变量 sum。 以下是一些如何使这个线程安全的选项:https://social.msdn.microsoft.com/Forums/vstudio/en-US/d87c1085-cacb-4d82-826f-4151bf967f86/parallelfor-with-sum?forum=parallelextensions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 2018-02-25
      相关资源
      最近更新 更多