RhinoMocks AAA Синтаксис - PullRequest
       8

RhinoMocks AAA Синтаксис

2 голосов
/ 28 февраля 2010

Я потратил большую часть дня, пытаясь выяснить, почему простой тест 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 будет иметь Возвращаемое значение, установленное Expect. GetFilesForCopy возвращает два файла в myFileInfo. Пожалуйста помоги. :)

спасибо заранее!

Ответы [ 3 ]

7 голосов
/ 28 февраля 2010

Макет не начнет возвращать записанные ответы , пока не переключится в режим воспроизведения с помощью Replay(). Окурки и издевательства не работают одинаково. Я написал сообщение в блоге о разнице.

Также обратите внимание, что вы смешиваете старый синтаксис "запись-воспроизведение-проверка" с новым синтаксисомrange-act-assert С AAA вы не должны использовать mocks и 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 не устанавливает никаких ожиданий.

Преимущество разделения поведения и утверждений состоит в том, что вы можете делать меньше утверждений на тест, что упрощает диагностику причин сбоя теста.

1 голос
/ 28 февраля 2010

Действительно ли метод 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");

Подробнее об ограничениях аргументов см .: Mhino Rhino 3.5, Ограничения аргумента

Я почти уверен, что есть также возможности сделать регистр нечувствительным к регистру.

0 голосов
/ 23 марта 2010

Я думаю, это потому, что ваш метод CopyvRAFiles () не является виртуальным.

...