NSubstitute Возвращает метод и массивы - PullRequest
0 голосов
/ 03 мая 2018

, поэтому я хочу проверить результаты броска набора игральных костей, но я не могу передать массив как аргумент в методе Returns следующим образом:

    [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 голосов
/ 04 мая 2018

NSubstitute не имеет 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, которое явно определяет способ обработки пустого регистра.

...