2015-06-30 12 views
6

Có thể kiểm tra xem một phương pháp đã được gọi bằng cách sử dụng Moq and dependency injection hay không. Tuy nhiên, có thể kiểm tra nếu một phương thức trong một lớp gọi một phương thức khác trong cùng một lớp không?Kiểm tra xem phương pháp trong ClassA đã được gọi từ một phương pháp khác trong ClassA

Ví dụ, tôi muốn kiểm tra xem nếu tôi đăng nhập một ngoại lệ nhất định, thì thông báo thông tin cũng sẽ được ghi lại.

Phương pháp này là:

public void Error(string message, Exception exception, long logId = 0) 
{ 
    var int32 = (int)logId; 
    Info("Id was converted to an int so that it would fit in the log: " + logId, int32); 
    Error(message, exception, int32); 
} 

Đây là nỗ lực của tôi tại đơn vị thử nghiệm nó. Bài kiểm tra thất bại, có cách nào mà nó có thể được thực hiện?

void logging_an_error_with_a_long_id_also_logs_info() 
{ 
    var mock = new Mock<ILogger>(); 
    var testedClass = new Logger(); 
    var counter = 0; 

    testedClass.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue); 

    mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>())); 
} 

Kể từ khi InfoError phương pháp này trong cùng một lớp (ClassA), tôi không tin rằng tôi có thể vượt qua ClassA như một sự phụ thuộc vào ClassA. Vì vậy, nó không cần thử nghiệm?

+0

Có giao diện [tại đây] (http://stackoverflow.com/questions/1417048/how-to-verify-another-method-in-the-class-was-called-using-moq). – dee

Trả lời

7

Điều tốt nhất bạn có thể làm là thực hiện Infovirtual. Điều này sẽ cho phép bạn tạo một Mock<Logger>, đặt CallBase = true và xác minh rằng Info đã được gọi.

var mock = new Mock<Logger> 
{ 
    CallBase = true 
}; 

mock.Object.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue); 

mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>())); 

Bằng cách này, bạn vẫn gọi việc thực hiện thực tế của Error, nhưng bạn đã sử dụng Moq để xác minh các phương pháp Info được gọi.

+0

+1 tính năng này hoạt động khi Mock được sử dụng vì cần có lớp thực. Không hoạt động cho giao diện Mock . – dee

5

Có vẻ như bạn đang cố kiểm tra sai. Nó không thực sự quan trọng là phương pháp Info trên lớp của bạn được gọi từ phương thức Error, điều quan trọng là hành vi của phương pháp Info xảy ra. Làm thế nào nó xảy ra là một chi tiết thực hiện của lớp.

Nếu tôi đã có một lớp toán với hai chức năng:

public int Mult(int x, int y) { 
    return x*y; 
} 

public int Sqr(int x) { 
    return Mult(x,y); 
} 

tôi sẽ không kiểm tra mà gọi Sqr gọi đến Mult chức năng, tôi sẽ thử nghiệm Sqr(4)==16. Nó không quan trọng nếu tính toán đó diễn ra trong phương pháp Sqr, hoặc trong một phương pháp khác của lớp.

Trong khi @ Andrew's solution có lẽ là những gì bạn đang theo dõi, chế nhạo lớp bạn đang thử nghiệm có xu hướng dẫn đến kiểm tra chặt chẽ, giòn.

Nếu không thực tế khi kiểm tra cuộc gọi bằng cách quan sát tác dụng phụ của nó, thì đó có thể là dấu hiệu cho thấy việc triển khai có thể sử dụng một chút tái cấu trúc.

+0

Thật dễ dàng để nói rằng có lẽ một cách tốt hơn là cung cấp một cách tốt hơn – Hoppe

+0

@Hoppe Trong khi đó là sự thật, để cung cấp một cách tốt hơn, thường cần nhiều ngữ cảnh hơn được cung cấp (ví dụ: tôi không biết nội dung của bạn Lỗi hoặc phương thức Thông tin). Đôi khi, điều tốt nhất có thể làm là chỉ ra một hướng thay thế, trong đó một số sẽ mở ra cánh cửa cho phép họ xem xét vấn đề của họ theo một cách khác. – forsvarir

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