我花了一天的大部分时间试图弄清楚为什么简单的 RhinoMocks 测试没有返回我在返回中设置的值。我确信我只是错过了一些非常简单的东西,但我无法弄清楚。这是我的测试:
[TestMethod]
public void CopyvRAFiles_ShouldCallCopyvRAFiles_ShouldReturnTrue2()
{
FileInfo fi = new FileInfo(@"c:\Myprogram.txt");
FileInfo[] myFileInfo = new FileInfo[2];
myFileInfo[0] = fi;
myFileInfo[1] = fi;
var mockSystemIO = MockRepository.GenerateMock<ISystemIO>();
mockSystemIO.Stub(x => x.GetFilesForCopy("c:")).Return(myFileInfo);
mockSystemIO.Expect(y => y.FileCopyDateCheck(@"c:\Myprogram.txt", @"c:\Myprogram.txt")).Return("Test");
CopyFiles copy = new CopyFiles(mockSystemIO);
List<string> retValue = copy.CopyvRAFiles("c:", "c:", new AdminWindowViewModel(vRASharedData));
mockSystemIO.VerifyAllExpectations();
}
我的 SystemIO 类有一个接口,我将其模拟传递给我的 CopyFiles 类。我对 FileCopyDatCheck 方法设置了期望,并表示它应该返回(“Test”)。当我单步执行代码时,它返回一个 null 。我在这里缺少什么想法吗?
这是我的 CopyFiles 类方法:
public List<string> CopyvRAFiles(string currentDirectoryPath, string destPath, AdminWindowViewModel adminWindowViewModel)
{
string fileCopied;
List<string> filesCopied = new List<string>();
try
{
sysIO.CreateDirectoryIfNotExist(destPath);
FileInfo[] files = sysIO.GetFilesForCopy(currentDirectoryPath);
if (files != null)
{
foreach (FileInfo file in files)
{
fileCopied = sysIO.FileCopyDateCheck(file.FullName, destPath + file.Name);
filesCopied.Add(fileCopied);
}
}
//adminWindowViewModel.CheckFilesThatRequireSystemUpdate(filesCopied);
return filesCopied;
}
catch (Exception ex)
{
ExceptionPolicy.HandleException(ex, "vRAClientPolicy");
Console.WriteLine("{0} Exception caught.", ex);
ShowErrorMessageDialog(ex);
return null;
}
}
我认为“fileCopied”将具有由 Expect 设置的返回值。 GetFilesForCopy 返回 myFileInfo 中的两个文件。请帮忙。 :)
提前致谢!
模拟不会开始返回记录的答案直到切换到重播模式 with Replay()
。存根和模拟的工作方式不同。我写了一个博客文章 http://mindinthewater.blogspot.com/2010/02/mocking-frameworks-stubs-vs-mocks.html关于差异。
另请注意,您将旧的 record-replay-verify 语法与新的range-act-assert 语法混合在一起。对于 AAA,您不应该使用模拟和Expect
。相反,使用存根和AssertWasCalled
像这样:
[TestMethod]
public void CopyvRAFiles_ShouldCallCopyvRAFiles_ShouldReturnTrue2()
{
// arrange
FileInfo fi = new FileInfo(@"c:\Myprogram.txt");
FileInfo[] myFileInfo = new FileInfo[2];
myFileInfo[0] = fi;
myFileInfo[1] = fi;
var stubSystemIO = MockRepository.GenerateStub<ISystemIO>();
stubSystemIO.Stub(
x => x.GetFilesForCopy(Arg<string>.Is.Anything)).Return(myFileInfo);
stubSystemIO.Stub(
y => y.FileCopyDateCheck(
Arg<string>.Is.Anything, Arg<string>.Is.Anything)).Return("Test");
CopyFiles copy = new CopyFiles(mockSystemIO);
// act
List<string> retValue = copy.CopyvRAFiles(
"c:", "c:", new AdminWindowViewModel(vRASharedData));
// make assertions here about return values, state of objects, stub usage
stubSystemIO.AssertWasCalled(
y => y.FileCopyDateCheck(@"c:\Myprogram.txt", @"c:\Myprogram.txt"));
}
请注意在开始时设置存根的行为如何与最后的断言分开。Stub
不设定任何期望。
将行为和断言分开的优点是,您可以在每个测试中进行更少的断言,从而更容易诊断测试失败的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)