2012-01-16 28 views
30

Tôi đang cố gắng xác minh rằng phương thức trong một mô hình được gọi với tham số đối tượng dự kiến. Tôi đang sử dụng Moq, nUnit và suy nghĩ rằng tính tương thích của AutoFixture sẽ hoàn thành công việc. Dưới đây là một phiên bản đơn giản của những gì tôi đang cố gắng làm.Sử dụng Xác minh để xác nhận các giá trị tham số dự kiến ​​trong lớp Moq mock

Có cách nào để thực hiện điều này với Tự động trộn không? Có cách nào tốt hơn để xác minh rằng Something được gọi với thông số thích hợp không?

trọng bằng trong lớp A để so sánh các giá trị tài sản và thay đổi dòng Verify tới:

barMock.Verify(m => m.Something(a)); 

đèo, tuy nhiên tôi không muốn ghi đè Equals trong mỗi lớp như A trong dự án của tôi.

namespace Test 
{ 
    using Moq; 
    using NUnit.Framework; 
    using Ploeh.SemanticComparison.Fluent; 

    public class A 
    { 
     public int P1 { get; set; } 
    } 
    public interface IBar 
    { 
     void Something(A a); 
    } 

    public class Foo 
    { 
     public A Data { get; private set; } 
     public void DoSomethingWith(IBar bar) 
     { 
      Data = new A { P1 = 1 }; 
      bar.Something(Data); 
     } 
    } 

    [TestFixture] 
    public class AutoFixtureTest 
    { 
     [Test] 
     public void TestSample() 
     { 
      var foo = new Foo(); 
      var barMock = new Mock<IBar>(); 
      var a = new A { P1 = 1 }; 
      var expectedA = a.AsSource().OfLikeness<A>(); 

      foo.DoSomethingWith(barMock.Object); 

      expectedA.ShouldEqual(foo.Data); // passes 
      barMock.Verify(m => m.Something(expectedA.Value)); // fails 
     } 
    } 
} 

Trả lời

45

Trong Verify Moq bằng séc mặc định tham khảo bình đẳng cho các đối số vì vậy nó chỉ đi khi bạn cung cấp các trường hợp tương tự (trừ khi bạn đã overriden Equals) trong các thử nghiệm của bạn và trong việc thực hiện của bạn.

Trong trường hợp của bạn, expectedA.Value chỉ trả lại new A { P1 = 1 } được tạo trong thử nghiệm, tất nhiên không phải là cùng một trường hợp được tạo trong DoSomethingWith.

Bạn cần phải sử dụng It.Is xây dựng Moq để kiểm tra đúng cách này mà không có trọng Equals (trong thực tế cho điều này bạn không cần Autofixture tại tất cả):

barMock.Verify(m => m.Something(It.Is<A>(arg => arg.P1 == a.P1))); 

Nhưng nếu bạn có nhiều tài sản như P1, P2 , P3 ... AutoFixture có thể hữu ích:

barMock.Verify(m => m.Something(It.Is<A>(arg => expectedA.Equals(a)))); 

Vì bạn không cần phải viết kiểm tra eqaulity theo cách thủ công cho tất cả các thuộc tính.

+2

+1 Đặc biệt giải pháp cuối cùng là cách tiếp cận chính xác với Mức độ phù hợp. FWIW có một mục công việc cho một chức năng mới cho Likeness để cho phép nó tự động phát ra một proxy ghi đè Equals, mà sẽ đơn giản hóa rất nhiều cú pháp trên: http://autofixture.codeplex.com/workitem/4230 –

+0

Điều đó đã làm điều đó, cảm ơn ! – jaminto

5

Nếu bạn nâng cấp lên AutoFixture 2.9.1 (hoặc mới hơn), bạn có thể gọi phương thức CreateProxy trên cá thể Likeness sẽ phát ra proxy động cho loại đích.

Tính năng ghi đè proxy động được tạo bằng Bằng cách sử dụng tính đơn giản để đơn giản hóa cú pháp (khá nhiều).

Đây là phương pháp thử nghiệm ban đầu, sửa đổi để sử dụng proxy chân dung:

[Test] 
public void TestSample() 
{ 
    var foo = new Foo(); 
    var barMock = new Mock<IBar>(); 
    var expected = new A().AsSource().OfLikeness<A>().CreateProxy(); 
    expected.P1 = 1; 

    foo.DoSomethingWith(barMock.Object); 

    Assert.True(expected.Equals(foo.Data));  // passes 
    barMock.Verify(m => m.Something(expected)); // passes 
} 

Lưu ý rằng nó cũng làm cho sự khẳng định thử nghiệm nhiều hơn nữa cụ thể hơn việc chấp nhận Bất kỳ dụ.

Bạn có thể tìm thêm thông tin chi tiết về tính năng mới này here.

Các vấn đề liên quan