2012-06-13 14 views
10

Tôi muốn thử chỉ phương pháp GetValue của lớp sau, sử dụng Moq:mocking một phần thời gian lên lớp Moq

public class MyClass 
{ 
    public virtual void MyMethod() 
    { 
     int value = GetValue(); 
     Console.WriteLine("ORIGINAL MyMethod: " + value); 
    } 

    internal virtual int GetValue() 
    { 
     Console.WriteLine("ORIGINAL GetValue"); 
     return 10; 
    } 
} 

Tôi đã đọc một chút cách này nên làm việc với Moq. Giải pháp mà tôi tìm thấy trực tuyến là sử dụng thuộc tính CallBase, nhưng điều đó không hiệu quả đối với tôi.

Đây là thử nghiệm của tôi:

[Test] 
public void TestMyClass() 
{ 
    var my = new Mock<MyClass> { CallBase = true }; 
    my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999); 
    my.Object.MyMethod(); 
    my.VerifyAll(); 
} 

Tôi mong rằng Moq sử dụng việc thực hiện hiện tại của MyMethod và gọi phương thức chế giễu, kết quả đầu ra sau đây:

ORIGINAL MyMethod: 999 
MOCKED GetValue 

nhưng đó là những gì tôi get:

ORIGINAL GetValue 
ORIGINAL MyMethod: 10 

và sau đó

Moq.MockVerificationException : The following setups were not matched: MyClass mock => mock.GetValue() 

Tôi có cảm giác, rằng tôi đã hiểu nhầm điều gì đó hoàn toàn. Tôi đang thiếu gì ở đây? Bất kỳ trợ giúp sẽ được đánh giá

+0

thể trùng lặp của [Khi chế giễu một lớp học với Moq, làm thế nào tôi có thể CallBase chỉ cụ thể phương pháp?] (http://stackoverflow.com/questions/2822947/when-mocking-a-class-with-moq-how-can-i-callbase-for-just-specific-methods) – StriplingWarrior

+0

Nếu bạn thực hiện 'của bạn Phương thức GetValue' 'public' thay vì' internal' nó hoạt động. Tôi không biết tại sao có lẽ đây là một hạn chế của proxy năng động lâu đài, hoặc nó là một lỗi một Moq, hoặc đây là hành vi dự định. Dù sao nếu bạn để nó như là nội bộ, bạn không thể đặt mã sản xuất của bạn đến một hội đồng khác nhau trừ khi bạn sử dụng InternalVisibleTo. – nemesv

+0

có thể trùng lặp của [Xác minh một phương thức đã được gọi] (http://stackoverflow.com/questions/1980108/verifying-a-method-was-called) – nemesv

Trả lời

5

OK, tôi tìm thấy câu trả lời cho điều này trong một câu hỏi khác: How to Mock the Internal Method of a class?. Vì vậy, đây là một bản sao và có thể được đóng lại.

Tuy nhiên, đây là giải pháp: chỉ cần thêm dòng này vào Assembly.config của dự án bạn muốn kiểm tra:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq 
+0

Để Assembly.config của thử nghiệm? Hoặc đến lớp đang được Assembly.config thử nghiệm? – Nick

+0

Của lớp học đang được kiểm tra! Tôi chỉnh sửa câu trả lời của tôi và làm rõ rằng bit. – Fabian

0

Bạn có cố gắng để xác định Verifiable:

my.Setup(mock => mock.GetValue()).Callback(() => Console.WriteLine("MOCKED GetValue")).Returns(999).Verifiable(); 
+0

đã không thử nó, nhưng nó làm cho không có sự khác biệt – Fabian