2009-12-03 26 views

回答

10

需要更多的上下文。所以,我把一個在這裏起訂量添加到組合:

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

當Calc不是抽象的或接口的時候,這是否工作?據我所知,'Moq'可以通過動態代理來使其不會生成新的IL指令,從而實現這一目標。 – kuskmen 2017-05-22 10:46:16

11

您必須使用一些模擬框架,如TypemockRhino MocksNMocks2

NUnit也有一個Nunit.Mock,但它不是衆所周知的。

的起訂量的語法,可以發現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")); 

另外請注意,您只能嘲笑接口,所以如果從System.IO.File你的對象不具有一個接口,那麼很可能你可以」不要做。您必須將您的電話打包到System.IO.File以內,才能進入您的自定義班級。

+2

NUnit只是運行測試,它不會做模擬或驗證。不同的責任。你應該能夠驗證你的模擬對象的期望,儘管我沒有使用Moq。 – kyoryu 2009-12-03 06:01:25

+0

是的,我看着錯誤的地方...我正在看nunit。現在我正在看moq。 :) – 2009-12-03 06:05:21

+0

最小起訂量可以讓你嘲笑抽象類。 – 2010-09-22 09:32:11

3

通過使用模擬接口。

假設你有你的班級ImplClass,它使用接口Finder並且你想確保Search函數被參數「hello」調用;

所以我們有:

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

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

然後,你可以寫一個模擬的測試代碼

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); 
    } 
} 

然後測試代碼:

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

在犀牛製品,其中一個叫AssertWasCalled

下面的方法是使用它

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());

方式
相關問題