2013-04-08 18 views
25

Sử dụng Moq, Cách thiết lập cuộc gọi phương thức với tham số đầu vào làm đối tượng có giá trị thuộc tính dự kiến?Sử dụng Moq, Cách thiết lập cuộc gọi phương thức với tham số đầu vào làm đối tượng có giá trị thuộc tính dự kiến?

var storageManager = new Mock<IStorageManager>(); 
storageManager.Setup(e => e.Add(It.IsAny<UserMetaData>())); 

Phương thức Add() mong đợi đối tượng UserMetaData có thuộc tính FirstName.

Tôi muốn đảm bảo rằng một đối tượng thuộc loại UserMetaData với FirstName của "FirstName1" đã được chuyển.

Trả lời

40

Bạn có thể sử dụng Verify.

Ví dụ:

Xác minh rằng Add chưa từng được gọi với một UserMetaData với FirstName = "FirstName1":

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName!="FirstName1")), Times.Never()); 

Xác minh rằng Add được gọi ít nhất một lần với một UserMetaData với FirstName == "FirstName1" :

storageManager.Verify(e => e.Add(It.Is<UserMetaData>(d => d.FirstName=="FirstName1")), Times.AtLeastOnce()); 

Xác minh rằng Add được gọi chính xác một lần với FirstName == "Firstname1"LastName == "LastName2":

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1" 
                 && data.LastName == "LastName2"))); 

... 

storageManager.VerifyAll(); 
+0

sotrageManager.VerifyAll(); Điều này có hiệu quả không? –

+0

@FaisalHafeez 'VerifyAll()' sẽ hữu ích nếu bạn không gọi 'Verify' một cách rõ ràng, nhưng sử dụng' Setup' để xác định kỳ vọng của bạn. – sloth

+2

Sử dụng 'Setup (....)' và 'VerifyAll()' hoặc chỉ sử dụng 'Verify' tùy thuộc vào sở thích cá nhân của bạn và cả trường hợp sử dụng của bạn (Bạn có sử dụng giá trị trả về của hàm bạn đã cấu hình với' Setup' không ?, bạn có muốn chỉ định tần suất một hàm sẽ được gọi với 'Times' ?, v.v.) – sloth

6

Bạn có thể sử dụng phương pháp It.Is:

storageManager.Setup(e => e.Add(It.Is<UserMetaData>(data => data.FirstName == "FirstName1"))); 
8

phương pháp Dominic Kexel là tốt và sẽ làm việc. Bạn cũng có thể sử dụng gọi lại mặc dù đó là hữu ích nếu bạn cần phải làm bất kỳ kiểm tra đầu ra đó là phức tạp hơn.

UserMetaData parameter = null; 
var storageManager = new Mock<IStorageManager>(); 
storageManager 
    .Setup(e => e.Add(It.IsAny<UserMetaData>())) 
    .Callback((UserMetaData metaData) => parameter = metaData); 

Assert.That(parameter.FirstName, Is.EqualTo("FirstName1")); //If using fluent NUnit 

Lợi thế của điều này là nếu cần, bạn có thể thực hiện nhiều kiểm tra hơn tham số thay vì chỉ kiểm tra xem đó là "FirstName1".

Điểm bất lợi là nếu Add được gọi nhiều lần thì chỉ có tham số được truyền trong lần gọi cuối cùng sẽ được kiểm tra (mặc dù bạn có thể xác minh thêm rằng nó được gọi một lần).

Câu trả lời của Dominic tốt hơn câu trả lời chính xác của tôi nhưng tôi muốn chỉ ra gọi lại cho các tình huống tương tự khác.

+0

cảm ơn, có vẻ đầy hứa hẹn. Điều gì sẽ xảy ra nếu có nhiều hơn một thuộc tính, ví dụ: Họ, tuổi, v.v ...? –

+0

@ Ánh sáng, Nếu tất cả những thứ này nằm trong UserMetaData thì bạn có thể kiểm tra tất cả chúng một cách dễ dàng bằng cách sử dụng cùng một phương pháp. Câu trả lời ban đầu của tôi là hơi sai trong đó Assert của tôi đã kiểm tra tham số và nên có được parameter.FirstName. –

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