2013-06-04 49 views
16

Tôi mới vào Moq và thử nghiệm nói chung vì vậy đây là noobish tôi Q. Làm thế nào để kiểm tra nếu Status tài sản trên Yêu cầu đã được thiết lập sử dụng Moq?Kiểm tra nếu một tài sản được thành lập - sử dụng Moq

public class DudeManager 
{ 
     private readonly IDRepository _repo; 

     public DManager(IDRepository repo) 
     { 
      _repo = repo; 
     } 

     public void Create(Request r) 
     { 
      r.Status = Status.Submitted; 
      _repo.AddRequest(r); 
     } 
} 

Có cách tiếp cận nào tốt hơn những điều sau không? Có thể sử dụng VerifySet?

 [TestMethod] 
     public void AddingNewRequestSetsStatusToSubmitted() 
     { 
      //Arrange 
      var mock = new Mock<IDRepository>(); 
      var mockRequest = new Mock<Request>(); 
      var dManager = new DManager(mock.Object); 

      //Act 
      dManager.Create(mockRequest.Object); 

      //Assert 
      Assert.AreEqual(Status.Submitted, mockRequest.Object.Status); 
     } 

EDIT: Đây là phương pháp tôi đã kết thúc sử dụng sau khi tất cả những gợi ý hữu ích:

//Arrange 
var request = new Request(); 
var mock = new Mock<IDRepository>(); 
var dManager = new DManager(mock.Object); 
mock.Setup(x => x.AddRequest(It.IsAny<Request>())); 

//Act 
dManager.QueueNewRequest(request); 

//Assert 
Assert.AreEqual(RequestStatus.Submitted, request.Status); 

cách tiếp cận này có vẻ đúng với tôi. Có ai nghĩ khác không?

+0

Tôi tin rằng VerifySet phù hợp nhất. – neontapir

+0

Bạn có thể chỉ cho tôi một ví dụ về cách sử dụng nó không? Tôi đã thử bằng cách sử dụng VerifySet nhưng nó thổi lên trên tôi. –

+0

Tôi không thuyết phục VerifySet làm bất cứ điều gì cả, tôi chưa bao giờ có thể thất bại một bài kiểm tra với nó, luôn luôn vượt qua. Tôi đi qua trình gỡ lỗi và thấy giả của tôi là callbase đúng, tài sản trong câu hỏi là null, không có invocations. VerifySet với một vale "Xin chào thế giới" và điều đi ... vượt qua. Tôi sẽ đi với các đơn vị kiểm tra khuôn khổ và khẳng định điều này bằng nhau. –

Trả lời

25

Tôi nghĩ VerifySet là phương pháp phù hợp. Nó sẽ trông giống như thế này:

//Arrange 
var mock = new Mock<IDRepository>(); 
var mockRequest = new Mock<Request>(); 
// TODO: set some expectations here 

var dManager = new DManager(mock.Object); 

//Act 
dManager.Create(mockRequest.Object); 

//Assert 
mockRequest.VerifySet(x => x.Status = Status.Submitted); 

Tôi tin rằng trong trường hợp của bạn, nó sẽ thổi lên vì bạn chưa thiết lập Yêu cầu giả lập để xử lý thao tác thiết lập trên Trạng thái.

Một cách dễ dàng để làm điều đó là sử dụng SetupAllProperties, như vậy:

//Arrange 
var mock = new Mock<IDRepository>(); 
var mockRequest = new Mock<Request>(); 
mockRequest.SetupAllProperties(); 
+0

Nó vẫn không thành công với lỗi sau: Kết quả kiểm tra: \t Không thành công đã ném ngoại lệ: System.ArgumentException: Thiết lập không hợp lệ trên thành viên phi ảo (có thể ghi đè trong VB): –

+1

Tất nhiên, Yêu cầu không phải là giao diện trong trường hợp của bạn . Bạn cần đánh dấu thuộc tính Trạng thái là ảo để làm việc này. Và, như @ AD.net được đề cập dưới đây, trừ khi Yêu cầu có một số hành vi phức tạp, không cần phải giả lập nó. – neontapir

+0

Câu trả lời khác của Ufuk Hacıoğulları cũng đã làm việc nhưng tôi đã sửa đổi phiên bản này mà không có đối tượng Yêu cầu giả mạo. Tôi thích ý tưởng không chế nhạo đối tượng Yêu cầu và sau đó sử dụng lớp Assert để kiểm tra xem nó có bằng nhau hay không - không chắc liệu đây có phải là đúng hay không nhưng tôi cảm thấy đúng với tôi (đã chỉnh sửa bài đăng để hiển thị phiên bản đã sửa đổi/làm việc của tôi). bình luận nếu nó là một thực hành xấu –

5

Tôi nghĩ rằng bạn nên sử dụng hành vi nghiêm ngặt theo mặc định, sau đó bạn có thể làm cho việc xác minh với một cuộc gọi duy nhất. Nó cũng làm cho bạn viết bài kiểm tra của bạn rõ ràng hơn.

[TestMethod] 
public void AddingNewRequestSetsStatusToSubmitted() 
{ 
    //Arrange 
    var mock = new Mock<IDRepository>(MockBehavior.Strict); 
    var mockRequest = new Mock<Request>(MockBehavior.Strict); 
    var dManager = new DManager(mock.Object); 

    mockRequest.SetupSet(item => item.Status = It.IsAny<StatusType>()) 
       .Verifiable(); 

    //Act 
    dManager.Create(mockRequest.Object); 

    //Assert 
    Assert.AreEqual(mockRequest.Object.Status, Status.Submitted); 
    mock.VerifyAll(); 
    mockRequest.VerifyAll(); 
} 
4
mock.Verify(m=>m.AddRequest(It.Is<Request>(r=>r.Status == expectedStatus))); 

Bạn có thể xác minh rằng phương pháp AddRequest được gọi với tham số (Request) trong đó có đúng Status. Ngoài ra, chế nhạo đối tượng Request không thực sự cần thiết ở đây.