으로 사용합니다. FakeItEasy를 사용하여 객체의 메서드가이 동일한 객체에서 다른 메서드를 호출하는지 확인하려면 어떻게합니까?FakeItEasy의 A.CallTo()를 동일한 객체의 다른 메소드
테스트 :
[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;
}
}
내가 제안을 개방적이야. 이 모든 잘못을 저 지르게되면 알려주세요.
내가 이해할 때, 이것은 FIE가 무엇을위한 것이 아닌가. FIE는 가짜 오브젝트를 제공하여 프로덕션 코드를 더 쉽게 찌를 수 있습니다. 당신이 지적한 것처럼, 당신은 가짜가 아닙니다. 제 경험상, 이런 종류의 테스트는 일반적으로 좋은 생각이 아닙니다. MyMonkey 클래스는 자체 완비 된 단위 여야하며 자체 메서드 호출 여부를 염려하지 않고 바나나를 먹도록 명령받은 경우 전반적인 동작을 테스트하는 것이 좋습니다. 예를 들어, 바나나가 "// 여기에있는 일들"에서 일어나는 일에서 단서를 기반으로 먹었는지 여부를 말할 수 있습니까? –
@BlairConrad 내 실제 시나리오에서, WillEat은 더 복잡하고 고유 한 테스트를 가지고 있으며 이것은 EatBanana의 테스트 중 하나 일뿐입니다. 이 테스트에서 EatBanana가 실제 WillEat을 호출하게한다면 한 가지 테스트에서 두 가지 기능을 테스트하지 않겠습니까? WillEat이 바뀌면 테스트가 중단 될 수 있습니다. 그게 나쁜 소식입니다. 맞습니까? –
당신의 요점을 봅니다. 까다 롭습니다. WillEat이 다른 객체에 살면, 우리는 그 객체의 위조를 촉구하고 그것을'MyMonkey'에 주입합니다 (고통 스럽습니다). 내가 말할 수있는 것은 클라이언트의 관찰 가능한 결과에 의존하여 외부에서 'MyMonkey'를 테스트하는 것이 가장 좋은 기본 위치라고 생각합니다. 하지만 생각을 해봤지만 고통을 덜어 줄 수있는 솔루션을 발견하고 테스트 횟수를 줄일 수있을뿐만 아니라 주어진 횟수만큼 중단 될 수 있습니다. 당신은 코드가 가장 잘 알고 있으므로, 그것이 당신을 위해 작동한다면 ... 나는 단지 당신이 대안을 알고 있기를 바랬다. –