C# NSubstitute返回方法和数组

C# NSubstitute返回方法和数组,c#,nunit,tdd,nsubstitute,C#,Nunit,Tdd,Nsubstitute,所以我想测试骰子集的掷骰结果,但我不能在返回方法中以arg形式传递数组,如下所示: [TestCase(new[]{2, 2, 3, 1, 5}, Category.Yahtzee, 0)] public void AddPoints_ForGivenCategory_PointsAreStored( int[] rollResults, Category selectedCategory, int expectedScore) { _ra

所以我想测试骰子集的掷骰结果,但我不能在返回方法中以arg形式传递数组,如下所示:

    [TestCase(new[]{2, 2, 3, 1, 5}, Category.Yahtzee, 0)]
    public void AddPoints_ForGivenCategory_PointsAreStored(
        int[] rollResults, Category selectedCategory, int expectedScore)
    {
        _randomizer.GetRandomNumber(MIN_VALUE, MAX_VALUE).Returns(rollResults); //<-rollResults not allowed
        IDice[] dice = MakeNewDiceSet();

        _game.NewGame("A");
        _game.RollDice(dice);
        _game.AddPoints(selectedCategory);
        var result = _game.GameStatus().First()[selectedCategory];

        Assert.AreEqual(expectedScore, result);
    }
使用NSubstitute v3.1.0.0

NSubstitute没有ReturnsT[]值或类似值。相反,它具有ReturnsT initialValue、params T[]othervalue,以指示我们应该始终至少指定一个要返回的值。当时的目的是避免在空集合的情况下使用无值存根调用的潜在混乱情况。这是禁止行动吗?还是取消了通话

有几种方法可以达到你想要的行为。一种方法是将值分为第一个和第二个:

random.GetRandomNumber(1, 10)
      .Returns(rollResults.First(), rollResults.Skip(1).ToArray());
另一种方法是使用和存根GetRandomNumber来使用:

var rolls = new Queue<int>(rollResults);           
random.GetRandomNumber(1, 10).Returns(_ => rolls.Dequeue());

如果这是您经常需要的内容,那么您可能需要创建自己的返回扩展,以明确定义如何处理空大小写。

是_randomizer.getrandomnumermin\u VALUE,MAX\u VALUE是否返回单个数字或数组?@Nkosi它返回int。它看到int[]并尝试将其作为结果返回,结果将失败,因为它预期为单个int。您可以尝试使用数组索引的计数器返回函数作为解决方法。ReturnsT[]值是否将在将来实现?还是没有机会?@H3ll0欢迎使用。我不确定它是否值得实现,因为空数组可能存在歧义,并且有简单的替代方案,但其他合作者可能会有不同的感觉。所以可能值得讨论队列方法的一个优点是,如果请求另一个值,您将得到一个异常。
var rolls = new Queue<int>(rollResults);           
random.GetRandomNumber(1, 10).Returns(_ => rolls.Dequeue());