Tôi đang sử dụng Moq và muốn tạo các lớp trình tạo để tạo các mocks của tôi với các giá trị mặc định hợp lý có thể được ghi đè trong khi thiết lập thử nghiệm khi cần thiết. Cách tiếp cận tôi đã sử dụng các phương pháp mở rộng trong đó tôi chuyển các giá trị tham số đầu vào và đầu ra dự kiến. Trong khi làm như vậy, tôi thấy hành vi khác nhau trong những gì dường như với tôi là mã tương đương ngữ nghĩa: truyền It.IsAny() trực tiếp trong một thiết lập vs truyền giá trị của It.IsAny() gián tiếp trong một thiết lập. Ví dụ:Sự khác biệt giữa việc chuyển It.IsAny <int>() và giá trị của It.IsAny <int>() thành thiết lập phương thức
public interface IFoo
{
bool Bar(int value);
bool Bar2(int value);
}
public class Foo : IFoo
{
public bool Bar(int value) { return false; }
public bool Bar2(int value) { return false; }
}
var mock = new Mock<IFoo>();
mock.Setup(x => x.Bar(It.IsAny<int>())).Returns(true);
Assert.IsTrue(mock.Object.Bar(123)); // Succeeds
var myValue = It.IsAny<int>();
mock.Setup(x => x.Bar2(myValue)).Returns(true);
Assert.IsTrue(mock.Object.Bar2(123)); // Fails
Cả hai cuộc gọi tương đương (với tôi), nhưng cuộc gọi đến xác nhận không thành công của Bar2. Tại sao điều này?
Giải thích tuyệt vời, Ben. Tôi đã nghi ngờ vấn đề nằm trong đánh giá biểu hiện, như bạn mô tả, thay vì giá trị trả lại của It.IsAny(). Tôi nhìn vào nguồn phản chiếu trong ILSpy và có thể thấy It.IsAny , nhưng không thể lấy được cái đầu của tôi quấn quanh cách nó hoạt động liên quan đến vấn đề. Cảm ơn một lần nữa vì đã giải thích. –
Cảm ơn bạn đã thanh toán bù trừ cho phù thủy đó cho tôi! Tôi đã cố gắng nói "var anyFooParam = It.IsAny(); var anyBarParam = It.IsAny ();" để xem liệu nó có làm cho các bài kiểm tra của tôi dễ đọc hơn như: .Setup (mock => mock.method (anyFooParam, anyBarParam)). –