如何測試某個特定方法是否通過測試的結果調用了正確的參數?我正在使用NUnit。如何聲明使用NUnit調用了特定的方法?
該方法不返回任何內容。它只是寫在一個文件上。我正在使用模擬對象System.IO.File
。所以我想測試該函數是否被調用。
如何測試某個特定方法是否通過測試的結果調用了正確的參數?我正在使用NUnit。如何聲明使用NUnit調用了特定的方法?
該方法不返回任何內容。它只是寫在一個文件上。我正在使用模擬對象System.IO.File
。所以我想測試該函數是否被調用。
需要更多的上下文。所以,我把一個在這裏起訂量添加到組合:
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);
您必須使用一些模擬框架,如Typemock或Rhino Mocks或NMocks2。
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
以內,才能進入您的自定義班級。
NUnit只是運行測試,它不會做模擬或驗證。不同的責任。你應該能夠驗證你的模擬對象的期望,儘管我沒有使用Moq。 – kyoryu 2009-12-03 06:01:25
是的,我看着錯誤的地方...我正在看nunit。現在我正在看moq。 :) – 2009-12-03 06:05:21
最小起訂量可以讓你嘲笑抽象類。 – 2010-09-22 09:32:11
通過使用模擬接口。
假設你有你的班級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);
在犀牛製品,其中一個叫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());
當Calc不是抽象的或接口的時候,這是否工作?據我所知,'Moq'可以通過動態代理來使其不會生成新的IL指令,從而實現這一目標。 – kuskmen 2017-05-22 10:46:16