2012-06-12 29 views
24

tôi đã nhận được một lớp được lập luận bởi một đại biểu. Lớp này gọi rằng đại biểu, và tôi muốn đơn vị kiểm tra nó với Moq. làm thế nào để tôi xác minh rằng phương pháp này đã được gọi?Xác minh một đại biểu đã được gọi với Moq

dụ lớp:

public delegate void Foo(int number); 

public class A 
{ 
    int a=5; 

    A (Foo myFoo) 
    { 
     Foo(a); 
    } 
} 

và tôi muốn kiểm tra xem Foo được gọi. Cảm ơn bạn.

+3

Tôi nghĩ rằng bạn cần phải thay đổi câu trả lời được chấp nhận, bởi vì câu trả lời của @Lukazoid là đúng hơn lựa chọn của bạn. –

+0

Trong hàm tạo, dòng có nên đọc 'myFoo (a)' không? Bạn đang gọi cá thể của 'Foo', không phải là lớp' Foo', đúng không? –

Trả lời

28

Điều gì về việc sử dụng chức năng ẩn danh? Nó có thể hoạt động như một mô hình nội tuyến ở đây, bạn không cần một khuôn khổ giả mạo.

bool isDelegateCalled = false; 
var a = new A(a => { isDelegateCalled = true}); 

//do something 
Assert.True(isDelegateCalled); 
3

Moq không hỗ trợ đại diện mocking. Nhưng bạn có thể tạo ra một số giao diện, với phương pháp, mà phù hợp với chữ ký đại biểu của bạn:

public interface IBar 
{ 
    void M(int number); 
} 

Sau đó tạo giả, mà thực hiện giao diện này, và sử dụng đối tượng giả này để tạo ra đại biểu:

Mock<IBar> bar = new Mock<IBar>(); 
Foo foo = new Foo(bar.Object.M); 
A a = new A(foo); 
bar.Verify(x => x.M(5)); 

Sau khi tập thể dục sut của bạn, bạn sẽ có thể xác minh những kỳ vọng trên đối tượng giả của bạn.

CẬP NHẬT: Trên thực tế, bạn có thể chỉ cần chuyển bar.Object.M vào đường nối của mình mà không cần Foo tạo cá thể đại biểu. Nhưng dù sao, các đại biểu chế giễu đòi hỏi phải tạo ra giao diện.

+0

Chỉ là một FYI, Moq bây giờ hỗ trợ việc chế nhạo các đại biểu xem câu trả lời của tôi và [ở đây] (https://github.com/Moq/moq4/commit/e614ae5b4a14896503b59e2a70ac799bb66e741b) – Lukazoid

3

Bạn có thể làm một cái gì đó như thế:

public interface IWithFOOMethod 
{ 
    void FooAlikeMethod(int number); 
} 

Mock<IWithFOOMethod> myMock = new Mock<IWithFOOMethod>(); 

A a = new A(myMock.Object.FooAlikeMethod); 

myMock.Verify(call => call.Foo(It.IsAny<int>()), Times.Once()) 
1

Kể từ Moq không hỗ trợ chế giễu đại biểu, tôi sẽ thường xử lý này với một cái gì đó như:

var list = new List<int>(); 
var del = i => list.Add (i); 
var a = new A(del); 
list.ShouldContainOnly (new[] { 5 }); 

nơi các đại biểu được cung cấp thực hiện một số hành động đơn giản, có thể kiểm chứng được.

+1

Chỉ cần một FYI, Moq bây giờ hỗ trợ việc chế nhạo các đại biểu nhìn thấy của tôi câu trả lời và [tại đây] (https://github.com/Moq/moq4/commit/e614ae5b4a14896503b59e2a70ac799bb66e741b) – Lukazoid

32

Tính đến this commit Moq bây giờ hỗ trợ các chế nhạo của các đại biểu, đối với tình huống của bạn, bạn sẽ làm điều đó như sau:

var fooMock = new Mock<Foo>(); 
var a = new A(fooMock.Object); 

Sau đó, bạn có thể xác minh các đại biểu đã được gọi:

fooMock.Verify(f => f(5), Times.Once); 

Hoặc:

fooMock.Verify(f => f(It.IsAny<int>()), Times.Once); 
Các vấn đề liên quan