NSubstitute返回方法和数组

时间:2018-05-03 18:55:39

标签: 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)
    {
        _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);
    }

此问题的任何提示或解决方法?或者我被迫这样做:

    [TestCase(2, 2, 3, 1, 5, Category.Yahtzee, 0)]
    public void AddPoints_ForGivenCategory_PointsAreStored(
        int die1, int die2, int die3, int die4, int die5, Category selectedCategory, int expectedScore)
    {
        _randomizer.GetRandomNumber(MIN_VALUE, MAX_VALUE).Returns(die1, die2, die3, die4, die5);
        IDice[] dice = MakeNewDiceSet();
        / ...
    }

使用NSubstitute v3.1.0.0

1 个答案:

答案 0 :(得分:0)

NSubstitute没有$ ls -al dir2 drwxr-xr-x 2 david david 4096 May 4 01:54 . drwxr-xr-x 14 david david 49152 May 4 01:38 .. -rw-r--r-- 1 david david 0 May 4 01:53 bar -rw-r--r-- 1 david david 0 May 4 01:54 baz -rw-r--r-- 1 david david 0 May 4 01:44 foo (或类似)。相反,它有Returns<T>(T[] values)表示我们应该始终指定至少一个要返回的值。当时的目的是避免在空集合的情况下使用“无值”来存根调用的可能令人困惑的情况。 (这是无操作吗?还是清除通话?)

有几种方法可以获得您想要的行为。一种方法是将值拆分为“first”和“rest”:

Returns<T>(T initialValue, params T[] otherValues)

另一种方法是使用Queue和存根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()); 扩展名,该扩展名明确定义应如何处理空案例。