2009-12-03 32 views
8

Làm cách nào tôi có thể kiểm tra một phương pháp cụ thể đã được gọi với thông số phù hợp do thử nghiệm? Tôi đang sử dụng NUnit.Làm thế nào tôi có thể khẳng định rằng một phương pháp cụ thể được gọi là sử dụng NUnit?

Phương pháp không trả lại bất cứ điều gì. nó chỉ viết trên một tập tin. Tôi đang sử dụng đối tượng giả cho System.IO.File. Vì vậy, tôi muốn kiểm tra xem hàm có được gọi hay không.

Trả lời

10

Cần thêm ngữ cảnh. Vì vậy, tôi sẽ đưa ai ở đây thêm Moq để trộn:

pubilc class Calc { 
    public int DoubleIt(string a) { 
     return ToInt(a)*2; 
    } 

    public virtual int ToInt(string s) { 
     return int.Parse(s); 
    } 
} 

// The test: 
var mock = new Mock<Calc>(); 
string parameterPassed = null; 
mock.Setup(c => x.ToInt(It.Is.Any<int>())).Returns(3).Callback(s => parameterPassed = s); 

mock.Object.DoubleIt("3"); 
Assert.AreEqual("3", parameterPassed); 
+0

Tính năng này có hoạt động khi Calc không phải là trừu tượng hay giao diện không? Theo như tôi biết 'Moq' làm cho proxy năng động để làm cho mocks của nó không tạo ra các hướng dẫn IL mới để điều này có thể ... – kuskmen

11

Bạn phải sử dụng một số khung mocking, chẳng hạn như Typemock hoặc Rhino Mocks hoặc NMocks2.

NUnit cũng có một số Nunit.Mock, nhưng nó không nổi tiếng.

Cú pháp cho moq có thể tìm thấy here:

var mock = new Mock<ILoveThisFramework>(); 

// WOW! No record/reply weirdness?! :) 
mock.Setup(framework => framework.DownloadExists("2.0.0.0")) 
    .Returns(true) 
    .AtMostOnce(); 

// Hand mock.Object as a collaborator and exercise it, 
// like calling methods on it... 
ILoveThisFramework lovable = mock.Object; 
bool download = lovable.DownloadExists("2.0.0.0"); 

// Verify that the given method was indeed called with the expected value 
mock.Verify(framework => framework.DownloadExists("2.0.0.0")); 

Ngoài ra, lưu ý rằng bạn chỉ có thể chế nhạo giao diện, vì vậy nếu đối tượng của bạn từ System.IO.File không có một giao diện, sau đó có thể là bạn có thể' t làm. Bạn phải kết thúc cuộc gọi của mình đến System.IO.File bên trong lớp tùy chỉnh của riêng bạn cho công việc.

+2

NUnit chỉ chạy thử nghiệm, nó không làm mô phỏng hoặc xác minh. Trách nhiệm khác nhau. Bạn sẽ có thể xác minh sự mong đợi trên đối tượng giả của bạn, mặc dù tôi đã không sử dụng Moq. – kyoryu

+0

vâng tôi đang nhìn nhầm chỗ ... Tôi đang nhìn vào nunit. bây giờ tôi đang nhìn vào moq. :) –

+0

MOQ sẽ cho phép bạn giả lập các lớp trừu tượng. –

3

Bằng cách sử dụng mô hình cho giao diện.

Giả sử bạn có lớp học của bạn ImplClass trong đó sử dụng giao diện Finder và bạn muốn chắc chắn chức năng Search được gọi với đối số "hello";

vì vậy chúng tôi có:

public interface Finder 
{ 
    public string Search(string arg); 
} 

public class ImplClass 
{ 
    public ImplClass(Finder finder) 
    { 
    ... 
    } 
    public void doStuff(); 
} 

Sau đó, bạn có thể viết một mô hình cho mã thử nghiệm của bạn

private class FinderMock : Finder 
{ 
    public int numTimesCalled = 0; 
    string expected; 
    public FinderMock(string expected) 
    { 
    this.expected = expected; 
    } 
    public string Search(string arg) 
    { 
    numTimesCalled++; 
    Assert.AreEqual(expected, arg); 
    } 
} 

thì mã kiểm tra:

FinderMock mock = new FinderMock("hello"); 
ImplClass impl = new ImplClass(mock); 
impl.doStuff(); 
Assert.AreEqual(1, mock.numTimesCalled); 
2

Trong Rhino Mocks nơi là một phương pháp gọi là AssertWasCalled

Dưới đây là một cách để sử dụng nó

var mailDeliveryManager = MockRepository.GenerateMock<IMailDeliveryManager>(); 
 

 
var mailHandler = new PlannedSending.Business.Handlers.MailHandler(mailDeliveryManager); 
 

 
mailHandler.NotifyPrinting(User, Info); 
 

 
mailDeliveryManager.AssertWasCalled(x => x.SendMailMessage(null, null, null), o => o.IgnoreArguments());

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