Dưới đây là làm thế nào để làm điều đó bằng cách xây dựng khẳng định vào từng phương pháp gọi.
// Arrange - Build the necessary assertions into the stubbed method invocations.
var mock = MockRepository.GenerateMock<ISomeService>();
mock.Stub(m => m.Method1()).WhenCalled(inv => mock.AssertWasNotCalled(m => m.Method2()));
mock.Stub(m => m.Method2()).WhenCalled(inv => mock.AssertWasNotCalled(m => m.Method3()));
// Act
myObject.Service = mock;
// Assert - Ensure each expected method was called.
mock.AssertWasCalled(m => m.Method1());
mock.AssertWasCalled(m => m.Method2());
mock.AssertWasCalled(m => m.Method3());
Do đây là hỗn hợp lên bình thường mô hình sắp xếp-hành-khẳng định bằng cách chạy khẳng định vào giữa hành động, tôi muốn bao gồm các thông báo lỗi rất cụ thể đối với những trường hợp này để xác định thất bại kiểm tra dễ dàng hơn.
mock.Stub(m => m.Method1()).WhenCalled(inv =>
mock.AssertWasNotCalled(m => m.Method2(), opt =>
opt.Message("Method2 cannot be called before Method1.")));
Bạn cũng có thể đạt được kết quả tương tự bằng cách lưu kết quả của mỗi lời gọi trong biến trong bước hành động và sau đó kiểm tra trạng thái biến trong bước xác nhận. Điều này tốt hơn bảo tồn sự phân chia của mô hình sắp xếp-hành động-khẳng định, nhưng nó là nhiều hệ thống ống nước mã để viết và duy trì.
// Arrange - Build the necessary state variables into the stubbed method invocations.
bool wasMethod1Called;
bool wasMethod2Called;
bool wasMethod2CalledBeforeMethod1;
bool wasMethod3CalledBeforeMethod2;
var mock = MockRepository.GenerateMock<ISomeService>();
mock.Stub(m => m.Method1()).WhenCalled(inv =>
{
wasMethod1Called = true;
});
mock.Stub(m => m.Method2()).WhenCalled(inv =>
{
wasMethod2Called = true;
wasMethod2CalledBeforeMethod1 = !wasMethod1Called;
});
mock.Stub(m => m.Method3()).WhenCalled(inv =>
{
wasMethod3CalledBeforeMethod2 = !wasMethod2Called;
});
// Act
myObject.Service = mock;
// Assert - Ensure each expected method was called, and that they were called in the right order.
mock.AssertWasCalled(m => m.Method1());
mock.AssertWasCalled(m => m.Method2());
mock.AssertWasCalled(m => m.Method3());
Assert.That(wasMethod2CalledBeforeMethod1, Is.False, "Method2 cannot be called before Method1.");
Assert.That(wasMethod3CalledBeforeMethod2, Is.False, "Method3 cannot be called before Method2.");
Nguồn
2014-07-30 16:02:20
Điều này không phải luôn luôn như vậy. Có những hợp đồng của các đối tượng statefull nơi đặt hàng các vấn đề và bạn có thể không phải luôn luôn tránh những hợp đồng. – sanosdole
Tôi đồng ý với nhận xét của @sanosdole nhưng trong trường hợp của tôi, bạn đã phát hiện ra. Tôi nên thử nghiệm kết quả ... chứ không phải việc thực hiện. Cảm ơn! – MoMo
Nếu mã đã có khớp nối thời gian, nó cũng cần được kiểm tra. – SerG