Ami*_*ard 4 testing unit-testing moq mocking
我想用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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的考验:
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();
}
Run Code Online (Sandbox Code Playgroud)
那么,为什么会出现此错误:
Moq.MockVerificationException:以下设置不匹配:FileActions2 s => s.GetConvertedFileToZip(D:\ ZipFiles\elmah.nupkg)
Spo*_*ock 16
单元测试有几个问题.我只会强调事物的嘲笑方面,因为它与你提出的问题有关.你的问题也引用了"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();
}
Run Code Online (Sandbox Code Playgroud)
你写这个测试的方式,起订量不会对GetConvertedFileToZip验证这个测试失败,从根本上是因为起订量不能为虚方法GetConvertedFileToZip提供覆盖.您必须创建一个代理i,e mock.Object.
如果您修改您的测试以这样的方式让你的SUT(被测Sysytem),消耗了嘲笑的对象/代理对象的确认将部分工作的一个实例(部分意味着你正朝着正确的方向).还有别的东西可以解决我在下面描述的内容.
假设您的SUT如下所示
public class Sut
{
public void Do(FileActions fileActions)
{
var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg");
var s = fileActions.GetConvertedFileToZip(fileInfo);
}
}
Run Code Online (Sandbox Code Playgroud)
你的考试
[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();
}
Run Code Online (Sandbox Code Playgroud)
这会产生例外.这是因为在通过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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5679 次 |
| 最近记录: |