繁体   English   中英

NSubstitute返回方法和数组

[英]NSubstitute Returns method and arrays

所以我想测试掷骰子的掷骰结果,但是我不能像这样在Returns方法中将数组作为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

NSubstitute没有Returns<T>(T[] values) (或类似Returns<T>(T[] values) )。 相反,它具有Returns<T>(T initialValue, params T[] otherValues)指示我们应始终指定至少一个要返回的值。 当时的目的是避免在出现空集合的情况下将呼叫存为“无值”的潜在混乱情况。 (这是无人操作吗?还是可以清除通话?)

有几种方法可以获取所需的行为。 一种方法是将值分为“ first”和“ rest”:

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());

如果这是您经常需要的东西,则可能值得创建自己的Returns扩展,该扩展显式定义应如何处理空情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM