Sử dụng FakeItEasy, làm cách nào để kiểm tra xem phương thức của đối tượng của tôi có gọi phương thức khác trên cùng một đối tượng này không?Sử dụng A.CallTo của FakeItEasy trên một phương thức khác trong cùng một đối tượng
Các thử nghiệm:
[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();
}
The Class:
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;
}
}
Tôi mở để gợi ý. Nếu tôi đang đi về điều này tất cả sai, xin vui lòng cho tôi biết.
Đây không thực sự là những gì FIE dành cho, vì tôi hiểu nó. FIE cung cấp các đối tượng giả mạo để mã sản xuất của bạn có thể dễ dàng được chọc và thúc đẩy hơn. Như bạn chỉ ra, bạn không có giả mạo. Theo kinh nghiệm của tôi, loại thử nghiệm này thường không phải là một ý tưởng hay. Lớp MyMonkey của bạn nên là một đơn vị khá độc lập và bạn nên kiểm tra hành vi tổng thể của nó khi được yêu cầu ăn chuối, hơn là lo lắng liệu nó có được gọi là phương pháp riêng của nó hay không. Ví dụ, bạn có thể biết liệu chuối có được ăn dựa trên những manh mối từ những gì xảy ra trong "// làm những việc ở đây" không? –
@BlairConrad trong kịch bản thực tế của tôi, WillEat phức tạp hơn, và có các bài kiểm tra riêng của nó, và đây chỉ là một trong những bài kiểm tra mà EatBanana có. Trong bài kiểm tra này, nếu tôi để EatBanana gọi WillEat thực sự, tôi sẽ không thử nghiệm hai tính năng trong một bài kiểm tra? Sau đó, nếu WillEat thay đổi, nó có thể phá vỡ thử nghiệm đó, đó là tin xấu, phải không? –
Tôi thấy quan điểm của bạn. Đó là khó khăn. Nếu 'WillEat' sống trên một vật thể khác, tất cả chúng ta sẽ thúc giục sự giả mạo của vật thể đó và tiêm nó vào 'MyMonkey' (nghe có vẻ đau đớn). Tất cả những gì tôi thực sự có thể nói là tôi nghĩ rằng vị trí mặc định tốt nhất sẽ là thử nghiệm 'MyMonkey' từ bên ngoài, dựa vào kết quả quan sát của khách hàng. Nhưng, bạn đã suy nghĩ về nó, và đã tìm thấy một giải pháp giúp bạn giảm đau và giảm số lượng các bài kiểm tra cũng như số lượng sẽ phá vỡ cho một. Bạn biết mã tốt nhất, vì vậy nếu nó hoạt động cho bạn ... Tôi chỉ muốn bạn biết về phương án thay thế. –