首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RhinoMocks AAA语法

RhinoMocks AAA语法
EN

Stack Overflow用户
提问于 2010-02-28 07:55:00
回答 3查看 1.3K关注 0票数 2

我花了一天的大部分时间试图弄清楚为什么一个简单的RhinoMocks测试不能返回我在返回中设置的值。我确信我只是错过了一些非常简单的东西,但我不能弄明白。这是我的测试:

代码语言:javascript
复制
    [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类方法:

代码语言:javascript
复制
    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中返回这两个文件。请帮帮忙。:)

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-28 19:16:15

在切换到带有Replay()的重播模式之前,模拟不会开始返回录制的答案。存根和模拟不会以相同的方式工作。我已经写了一个关于这个区别的blog post

还要注意,您将旧的记录-重放-验证语法与新的排列-动作-断言语法混合在一起。对于AAA,您不应该使用mock和Expect。相反,可以像这样使用存根和AssertWasCalled

代码语言:javascript
复制
[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没有设置任何期望。

分离行为和断言的好处是,您可以在每个测试中创建更少的断言,从而更容易诊断测试失败的原因。

票数 7
EN

Stack Overflow用户

发布于 2010-02-28 20:31:34

FileCopyDateCheck方法真的是以确切的字符串@"c:\Myprogram.txt"@"c:\Myprogram.txt"作为参数来调用的吗?

我不确定FileInfo是否对c:\做了什么。也许它被修改为大写的C:\,这会使您的期望不起作用。

也许可以尝试一个不检查确切参数值的期望

代码语言:javascript
复制
mockSystemIO.Expect(y => y.FileCopyDateCheck(Arg<string>.Is.Anything, Arg<string>.Is.Anything)).Return("Test");

有关参数约束的更多详细信息,请参阅:Rhino Mocks 3.5, Argument Constraints

我非常确定也有可能使期望不区分大小写。

票数 1
EN

Stack Overflow用户

发布于 2010-03-23 09:28:44

我认为这是因为您的CopyvRAFiles()方法不是虚拟的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2349454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档