RhinoMocks AAA Синтаксис
Я потратил большую часть дня, пытаясь выяснить, почему простой тест 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 и говорю, что он должен возвращать ("Тест"). Когда я перехожу через код, он возвращает нулевое значение. Есть идеи, что мне здесь не хватает?
Вот мой метод класса 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 будет иметь значение Return, установленное Expect. GetFilesForCopy возвращает два файла в myFileInfo. Пожалуйста помоги.:)
заранее спасибо!
3 ответа
Макет не начнет возвращать записанные ответы, пока он не переключится в режим воспроизведения с Replay()
, Окурки и издевательства не работают одинаково. Я написал сообщение в блоге о разнице.
Также обратите внимание, что вы смешиваете старый синтаксис 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
не устанавливает никаких ожиданий.
Преимущество разделения поведения и утверждений состоит в том, что вы можете делать меньше утверждений на тест, что упрощает диагностику причин сбоя теста.
Есть ли метод 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
Я вполне уверен, что есть также возможности сделать регистр нечувствительным к регистру.
Я думаю, это потому, что ваш метод CopyvRAFiles() не является виртуальным.