Используйте A.CallTo() из FakeItEasy для другого метода в том же объекте
Используя FakeItEasy, как мне проверить, вызывает ли метод моего объекта другой метод для этого же объекта?
Тест:
[TestMethod]
public void EatBanana_CallsWillEat()
{
var banana = new Banana();
var myMonkey = new Monkey();
myMonkey.EatBanana(banana);
//this throws an ArgumentException, because myMonkey is a real instance, not a fake
A.CallTo(() => myMonkey.WillEat(banana)
.MustHaveHappened();
}
Класс:
public class MyMonkey {
private readonly IMonkeyRepo _monkeyRepo;
public MyMonkey(IMonkeyRepo monkeyRepo) {
_monkeyRepo = monkeyRepo;
}
public void EatBanana(Banana banana) {
//make sure the monkey will eat the banana
if (!this.WillEat(banana)) {
return;
}
//do things here
}
public bool WillEat(Banana banana) {
return !banana.IsRotten;
}
}
Я открыт для предложений. Если я все делаю неправильно, пожалуйста, дайте мне знать.
2 ответа
Это возможно сделать. Если WillEat
метод был виртуальным - иначе FakeItEasy не сможет его подделать.
С этим изменением вы можете сделать это:
[TestMethod]
public void EatBanana_CallsWillEat()
{
var fakeMonkey = A.Fake<MyMonkey>();
fakeMonkey.EatBanana(new Banana());
A.CallTo(()=>fakeMonkey.WillEat(A<Banana>._)).MustHaveHappened();
}
Я все еще не убежден, что это хорошая идея (как я заметил в комментариях) - я думаю, что вам лучше полагаться на другое наблюдаемое поведение, но я не знаком с вашей системой. Если вы считаете, что это лучший способ, пример кода должен работать для вас.
Почему вы издеваетесь над проверенным объектом? Что именно вы пытаетесь проверить? Подтверждение того, что позвонить WillEat
случилось, имеет мало значения. Какую информацию он передает потребителю? В конце концов, потребителю все равно, как реализован метод. Потребитель заботится, каковы результаты.
Что происходит, когда обезьяна ест банан, который не гнилой? Ваш тест должен ответить на этот вопрос:
[TestMethod]
public void EatBanana_CAUSES_WHAT_WhenBananaIsNotRotten()
{
var repo = A.Fake<IMonkeyRepo>();
var monkey = new Monkey(repo);
var freshBanana = new Banana { IsRotten = false };
monkey.EatBanana(freshBanana);
// verifications here depend on what you expect from
// monkey eating fresh banana
}
Обратите внимание, что вы можете сделать все виды проверок IMonkeyRepo
, который правильно подделан и введен здесь.