我想用mock测试我的方法,但它抛出了这个异常。我的类是这个(这个类对文件执行一些简单的操作,就像解压缩文件一样):
public class FileActions
{
public virtual void Decompress(FileInfo fileInfo, DirectoryInfo directoryInfo)
{
ZipFile.ExtractToDirectory(fileInfo.FullName, directoryInfo.FullName);
}
public virtual FileInfo GetConvertedFileToZip(FileInfo fileInfo)
{
try
{
var changeExtension = Path.ChangeExtension(fileInfo.FullName, "zip");
File.Move(fileInfo.FullName, changeExtension);
return new FileInfo(changeExtension);
}
catch (Exception)
{
throw new FileNotFoundException();
}
}
}
这是我的测试:
public void TestMockedMethodForNotNull()
{
var mock = new Mock<FileActions>();
var fInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
mock.Setup(s => s.GetConvertedFileToZip(fInfo)).Verifiable();
mock.VerifyAll();
}
那么,为什么会出现这个错误:
Moq.MockVerificationException:以下设置未匹配: FileActions2 s =&gt; s.GetConvertedFileToZip(d:\ ZipFiles \ elmah.nupkg)
答案 0 :(得分:14)
您的单元测试有几个问题。我只会强调事物的嘲笑方面,因为它与你提出的问题有关。你的问题也提到“FileActions2”,我想这个 最初添加问题时出错。
你测试:
[TestMethod]
public void TestMockedMethodForNotNull()
{
var mock = new Mock<FileActions>();
var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
mock.Setup(s => s.GetConvertedFileToZip(fileInfo)).Verifiable();
mock.VerifyAll();
}
你编写这个测试的方式,Moq不会在GetConvertedFileToZip上验证 此测试从根本上失败,因为Moq无法为虚拟方法GetConvertedFileToZip提供覆盖。你必须创建一个代理i,e mock.Object。
如果以您的SUT(Sysytem Under Test)方式修改测试,则使用模拟对象/代理对象的实例 您的验证将部分工作(部分意味着您正朝着正确的方向)。还有别的东西可以解决我在下面描述的内容。
假设您的SUT如下所示
public class Sut
{
public void Do(FileActions fileActions)
{
var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
var s = fileActions.GetConvertedFileToZip(fileInfo);
}
}
你的考试
[TestMethod]
public void TestMockedMethodForNotNull()
{
var mock = new Mock<FileActions>();
var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
mock.Setup(s => s.GetConvertedFileToZip(fileInfo)).Verifiable();
var sut = new Sut();
sut.Do(mock.Object);
mock.VerifyAll();
}
这会产生异常。这是因为您通过Sut调用时设置的fileInfo与验证不匹配。
如果您要修改此测试,则会成功
[TestMethod]
public void TestMockedMethodForNotNull()
{
var mock = new Mock<FileActions>();
//var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
mock.Setup(s => s.GetConvertedFileToZip(It.IsAny<FileInfo>())).Verifiable();
var sut = new Sut();
sut.Do(mock.Object);
mock.VerifyAll();
}