如何断言使用NUnit调用特定方法?

时间:2009-12-03 05:55:45

标签: c# tdd nunit moq

如何测试由于测试而使用正确的参数调用特定方法?我正在使用NUnit

该方法不返回任何内容。它只是写在一个文件上。我正在使用System.IO.File的模拟对象。所以我想测试函数是否被调用。

4 个答案:

答案 0 :(得分:11)

您必须使用一些模拟框架,例如TypemockRhino MocksNMocks2

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

相关问题