我花了一天的大部分时间试图弄清楚为什么一个简单的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”)。当我单步执行代码时,它返回一个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中返回这两个文件。请帮帮忙。:)
提前感谢!
发布于 2010-02-28 19:16:15
在切换到带有Replay()的重播模式之前,模拟不会开始返回录制的答案。存根和模拟不会以相同的方式工作。我已经写了一个关于这个区别的blog post。
还要注意,您将旧的记录-重放-验证语法与新的排列-动作-断言语法混合在一起。对于AAA,您不应该使用mock和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没有设置任何期望。
分离行为和断言的好处是,您可以在每个测试中创建更少的断言,从而更容易诊断测试失败的原因。
发布于 2010-02-28 20:31:34
FileCopyDateCheck方法真的是以确切的字符串@"c:\Myprogram.txt"和@"c:\Myprogram.txt"作为参数来调用的吗?
我不确定FileInfo是否对c:\做了什么。也许它被修改为大写的C:\,这会使您的期望不起作用。
也许可以尝试一个不检查确切参数值的期望
mockSystemIO.Expect(y => y.FileCopyDateCheck(Arg<string>.Is.Anything, Arg<string>.Is.Anything)).Return("Test");有关参数约束的更多详细信息,请参阅:Rhino Mocks 3.5, Argument Constraints
我非常确定也有可能使期望不区分大小写。
发布于 2010-03-23 09:28:44
我认为这是因为您的CopyvRAFiles()方法不是虚拟的。
https://stackoverflow.com/questions/2349454
复制相似问题