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

Uma*_*med 8 c# tdd nunit moq

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

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

Gra*_*ton 11

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

NUnit也有一个Nunit.Mock,但它并不为人所熟知.

moq的语法可以在这里找到:

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"));
Run Code Online (Sandbox Code Playgroud)

另外,请注意您只能模拟界面,因此如果您的对象System.IO.File没有界面,那么可能您无法做到.您必须将调用包装到System.IO.File您自己的自定义类中.

  • NUnit只运行测试,它不进行模拟或验证.责任不同.虽然我没有使用Moq,但您应该能够验证模拟对象的期望值. (2认同)

Dmy*_*iak 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);
Run Code Online (Sandbox Code Playgroud)