Модульное тестирование Порядок операций - PullRequest
0 голосов
/ 05 марта 2019

Предположим, что мы хотим сделать стейки.

Public class Restaurant{
    public void MakeSteak(Steak rawSteak) {
      this.KitchenServices.AddSeasoning(rawSteak);
      this.KitchenServices.Grill(rawSteak);
    }
}

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

public void MakeSteakTest() {
  var rawSteak = new Steak();
  this.restaurant.MakeSteak(rawSteak);
  this.KitchenServices.Verify(x => x.AddSeasoning(rawSteak) , Times.Once);
  this.KitchenServices.Verify(x => x.Grill(rawSteak) , Times.Once);
}

Мой вопрос заключается в том, что у нас должен быть тест, чтобы удостовериться, что стейк не приправлен после того, как это жарено?Если да, то как?

Ответы [ 3 ]

3 голосов
/ 05 марта 2019

Обычно вы должны тестировать результаты , а не реализацию в модульном тесте. Что происходит в вашей системе, если MakeSteak были изменены, чтобы операции были в другом порядке? Это то, что можно наблюдать? Поскольку ваш единственный intput - это объект Steak, существует ли какая-то проверка, которая завершается неудачно, если Grill вызывается до AddSeasoning? Это - это то, что вы должны тестировать.

1 голос
/ 05 марта 2019

Один из способов - представить каждую операцию как объект команды, который работает со стейком, например,

interface ISteakOp {
    void DoTo(Steak s);
}

class AddSeasoningOp : ISteakOp { ... }
class GrillOp : ISteakOp { ... }

, а затем вернуть последовательность операций:

public List<ISteakOp> MakeSteakOps() {
    return new List<ISteakOp> {
        new AddSeasoningOp(),
        new GrillOp()
    };
}

, тогда ваш тест можетУтверждают, что любой гриль происходит перед любой приправой:

var ops = MakeSteakOps();
var grillIndex = ops.IndexOf(o => o is GrillOp);
if (grillIndex != -1) {
    var seasonIndex = ops.IndexOf(o = o is AddSeasoningOp);
    Assert.That(seasonIndex == -1 || seasonIndex < grillIndex);
}
0 голосов
/ 05 марта 2019

Мой вопрос заключается в том, что у нас должен быть тест, чтобы убедиться, что стейк не приправлен после того, как он приготовлен на гриле?

Во-первых: влияет ли это на поведение, видимое для Конечного пользователя / Заинтересованного лица, и заботятся ли они об этом?

Если да, то как?

Тогда:

  • Как это может обнаружить это влияние на поведение? Используйте тот же метод в своем тесте.
  • Какого поведения ожидает пользователь? Используйте это ожидание в своем тесте.

Это может показаться "слишком простым" / "пренебрежительно простым", но я абсолютно серьезен. Это определение правильного поведенческого тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...