2011-06-18 9 views
7

Sử dụng moq, nếu tôi cố gắng thử một phương pháp trực tiếp trên Foo, tôi có được điều này: Invalid verify on a non-virtual (overridable in VB) member.Làm thế nào tôi có thể thử một phương thức trên một đối tượng mà không có một hàm tạo mặc định?

thay thế của tôi là để thử IFoo, mà được thoát khỏi những vấn đề trên, nhưng sau đó tôi không thể xây dựng nó vì Foo không có một hàm tạo không tham số (Constructor arguments cannot be passed for interface mocks.). Tôi có thể làm gì?

Trả lời

6

Bạn sẽ có thể để chế nhạo IFoo mà không vấn đề, và bạn sẽ không có lý do gì để vượt qua đối số khi bạn đang chế giễu một giao diện. Giả lập IFoo của bạn sẽ chính xác như vậy (giả lập!), Và sẽ không có kiến ​​thức về Foo hoặc bất kỳ sự thực thi thực sự nào, vì vậy việc truyền các đối số của hàm tạo sẽ không có ý nghĩa.

Chỉnh sửa: Tôi sẽ thêm giao diện giả mạo đó nếu một giao diện tồn tại hầu như luôn thích hợp hơn để mô phỏng triển khai cụ thể. Nếu bạn chỉ có một thực thi cụ thể, thực tế là bạn muốn thử nó có lẽ có nghĩa là nó sẽ là một ứng cử viên tốt cho việc thêm một giao diện.

+1

Bạn hoàn toàn đúng. Tôi thậm chí còn không nghĩ đến chuyện này, tôi chỉ đang cố gắng làm một việc gì đó. Cảm ơn. – ryeguy

0

Moq tạo đối tượng proxy yêu cầu tất cả các phương thức giả mạo của bạn đều có thể ghi đè và lớp của bạn không bị đóng kín. Vì vậy, bạn có thể đánh dấu phương thức của mình là ảo.

Đoạn code dưới đây hoạt động tốt:

public interface IFoo 
{ 
    int Test(int myParameter); 
    int TestInternal(int myParameter); 
} 

public class Foo : IFoo 
{ 
    private int _someConstructorArgument; 

    public Foo(int someConstructorArgument) 
    { 
     _someConstructorArgument = someConstructorArgument; 
    } 

    public virtual int Test(int myParameter) 
    { 
     return _someConstructorArgument + TestInternal(myParameter); 
    } 

    public virtual int TestInternal(int myParameter) 
    { 
     return myParameter; 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var mock = new Mock<Foo>(MockBehavior.Loose, 50); 

     mock.Setup(x => x.TestInternal(100)) 
      .Returns(200); 

     mock.CallBase = true; 

     Console.WriteLine(mock.Object.Test(100)); 
     Console.ReadLine(); 
    } 
}