如何测试由于测试而使用正确的参数调用特定方法?我正在使用NUnit。
该方法不返回任何内容。它只是写在一个文件上。我正在使用System.IO.File
的模拟对象。所以我想测试函数是否被调用。
答案 0 :(得分:11)
您必须使用一些模拟框架,例如Typemock或Rhino Mocks或NMocks2。
NUnit也有一个Nunit.Mock,但它并不为人所熟知。
可以找到moq的语法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
。
答案 1 :(得分:11)
需要更多背景信息。所以我会在这里添加一个Moq:
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);
答案 2 :(得分:3)
通过使用模拟接口。
假设您的班级ImplClass
使用了接口Finder
,并且您希望确保使用参数“hello”调用Search
函数;
所以我们有:
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);
答案 3 :(得分:2)
在Rhino Mocks中,这是一个名为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());