2012-12-10 27 views
5

Tôi mới sử dụng thử nghiệm đơn vị và Moq. Tôi đã và đang làm một bài kiểm tra đơn vị và đây là đoạn mã sau:Giao diện thử nghiệm đơn vị với Moq

private Mock<IServiceAdapter> repository; 

    [TestInitialize] 
    public void Initialize() 
    { 
     repository= new Mock<IServiceAdapter>(); 
    } 

[TestMethod()] 
    public void SaveTest() 
    { 
     //Setup 
     string Name = "Name1"; 
     string Type = "1"; 
     string parentID = null; 

     repository.Setup(x => x.Save(Name , Type, parentID)).Returns("Success").Verifiable(); 

     //Do 
     var result = repository.Object.Save(Name , Type, parentID); 
     //Assert 
     repository.Verify(); 
    } 

Vấn đề của tôi là thử nghiệm sẽ luôn luôn trả về chuỗi mà tôi đặt trong tham số Returns, nói cách khác, nó sẽ luôn luôn trở về "thành công "hoặc bất cứ điều gì tôi viết vào vị trí của nó. Tôi đoán điều đó không đúng vì đó không phải là hành vi thực sự của dịch vụ. Bất cứ ai cũng biết làm thế nào tôi có thể phản ánh hành vi thực sự của dịch vụ "Lưu" mà tôi đang thử nghiệm? Vì vậy, cho phép nói, nếu chuỗi trả về khác với phương thức dịch vụ, thì thử nghiệm sẽ thất bại.

Đã chỉnh sửa

Giao diện ServiceAdapter chỉ là một trình bao bọc cho dịch vụ web mà tôi gọi là dịch vụ REST. Đó là một dự án biểu mẫu web.

tôi đang làm một cái gì đó giống như trong bài viết này

How to mock a web service

Tôi có nên tạo một cái gì đó giống như một FakeController với Dependency Injection để làm cho nó hoạt động?

Trả lời

11

Bạn đang thử nghiệm mô phỏng ở đây, điều này sẽ không cung cấp cho bạn gì (vì mẫu này không được sử dụng trong ứng dụng thực của bạn). Trong thử nghiệm đơn vị, bạn nên tạo và kiểm tra các đối tượng thực của bạn, mà tồn tại trong ứng dụng thực của bạn (tức là các triển khai giao diện). Mocks được sử dụng để chế nhạo phụ thuộc của các đối tượng được thử nghiệm.

Vì vậy, mô phỏng bộ điều hợp dịch vụ sẽ hữu ích cho các thử nghiệm đối tượng, sử dụng bộ điều hợp đó, ví dụ: một số kiểm tra bộ điều khiển:

private FooController _controller; // object under test, real object 
private Mock<IServiceAdapter> _serviceAdapter; // dependency of controller 

[TestInitialize] 
public void Initialize() 
{ 
    _serviceAdapter = new Mock<IServiceAdapter>(); 
    _controller = new FooController(_serviceAdapter.Object); 
} 

[TestMethod()] 
public void SaveTest() 
{ 
    // Arrange 
    string name = "Name1"; 
    string type = "1"; 
    string parentID = null; 

    _serviceAdapter.Setup(x => x.Save(name , type, parentID)) 
        .Returns("Success").Verifiable(); 

    // Act on your object under test! 
    // controller will call dependency 
    var result = _controller.Bar(name , type, parentID); 

    // Assert 
    Assert.True(result); // verify result is correct 
    _serviceAdapter.Verify(); // verify dependency was called 
} 
+0

Tôi đang thiếu thứ gì đó ở đây. Tôi không có một bộ điều khiển (đó là các biểu mẫu web). Tôi sẽ đưa thêm thông tin vào câu hỏi. –

+0

Bộ điều khiển @MorganSoren chỉ là một ví dụ. Nó có thể là bất kỳ lớp nào khác sử dụng bộ điều hợp dịch vụ của bạn. Tôi nghĩ rằng các hình thức web không phải là rất đơn vị testable như là, thường MVP mẫu được sử dụng để tạo ra các ứng dụng biểu mẫu web có thể kiểm tra. –

+0

@MorganSoren đây là câu hỏi về [biểu mẫu web thử nghiệm đơn vị] (http://programmers.stackexchange.com/questions/116089/is-is-possible-to-unit-test-a-web-forms-site) –

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