RhinoMocks AAA 语法

2023-12-24

我花了一天的大部分时间试图弄清楚为什么简单的 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(使用前将#替换为@)

RhinoMocks AAA 语法 的相关文章

  • Rhino 模拟抽象类而不模拟其虚拟方法?

    我可以执行存在于已使用 Rhino Mocks 模拟的抽象类上的虚拟方法的主体吗 需要明确的是 我并不是想模拟虚拟方法的行为 我正在尝试 测试 虚拟方法 在模拟类上 这个想法是对 Rhino Mocks 的公然滥用吗 是的 那应该绝对没问题
  • 如何使用 NUnit 和 Rhino Mocks 模拟 HttpContext.Current.Items

    我在用着NUnit and RhinoMocks用于 WebApi 项目的单元测试 我正在尝试编写一个测试方法 该方法应该向 HttpContext Current Items 添加一个项目 public override void OnA
  • 使用 Rhino 模拟抽象类的默认行为

    我对嘲笑还很陌生 所以这可能是我还没有意识到的事情 但我在任何地方都找不到一个好的例子 我试图断言默认情况下 任何从我的抽象类继承的类都会在构造函数中实例化一个集合 这是抽象类 public abstract class DataColle
  • 如何模拟 IQueryable

    我正在创建一个公开 IQueryable 的存储库 为我的单元测试模拟这个的最佳方法是什么 由于我将 RhinoMocks 用于其余的模拟对象 因此我尝试执行以下操作 IQueryable
  • 如何为异步方法编写单元测试用例?

    我想通过模拟依赖项来编写单元测试用例 整体流程如下 我们有一个WorklistLoader它有一个异步方法LoadWorklistItemsAsync 为了完成这个任务WorklistLoader依赖于下层 API 我想模拟 QueryMa
  • 除非我强制转换返回变量,否则对静态扩展方法进行存根似乎可以在 Rhino Mocks 中工作。为什么?

    我可以使用 Rhino Mocks 存根静态扩展方法 但如果我将返回值转换为另一种类型 则会收到错误 为什么 using Rhino Mocks public interface INumberGenerator double GetDou
  • Rhino Mocks 部分模拟

    我正在尝试测试一些现有类的逻辑 目前不可能重构这些类 因为它们非常复杂并且正在生产中 我想做的是创建一个模拟对象并测试一个在内部调用另一个很难模拟的方法的方法 所以我只想为辅助方法调用设置一个行为 但是当我设置该方法的行为时 该方法的代码被
  • 无法使用 Rhino Mocks 模拟具有数组参数的构造函数的类

    我们无法在 RhinoMocks 中模拟此类 public class Service public Service Command commands public abstract class Command Code var mock
  • 如何在 VB.NET 中使用 RhinoMocks 设置只读属性的返回值?

    我在 VB NET 中使用 RhinoMock 需要设置只读列表的返回值 这就是我的want要做 但不起作用 dim s Rhino Mocks MockRepository GenerateStub of IUserDto s Id gu
  • asp.net mvc rhino 模拟 httprequest 值

    我正在尝试编写一个测试 我可以模拟 HttpRequestBase 以返回这样的发布值吗 我怎样才能实现这个目标 var collection new NameValueCollection collection Add Id 1 coll
  • 如何为使用 RenderPartialViewToString 返回 JsonResult 的方法编写单元测试?

    如果您查看此链接中的示例 http www atlanticbt com blog asp net mvc using ajax json and partialviews http www atlanticbt com blog asp
  • 安排行动断言替代方案

    一般问题是单元测试是否有 AAA 的替代模式 如果是的话 看到一些例子并了解它们的优点和缺点将会非常有趣 作为 AAA 测试的最简单示例 在 C 中 为了简单起见 使用 var Arranging var annualSalary 1200
  • 模拟迭代行为

    我有一个具有迭代行为的界面 但在 Rhinomocks 中模拟它时遇到了麻烦 示例接口和类是我的问题的一个非常简单的版本 每次调用 LineReader Read 时 LineReader CurrentLine 都应返回不同的值 下一行
  • 使用 MVCContrib TestHelper 时出错

    在尝试实施第二个答案时上一个问题 https stackoverflow com questions 2887121 why does this asp net mvc unit test fail 我收到错误 我已经按照帖子所示实现了这些
  • Rhino Mocks - 使用 Arg.Matches

    我有一个正在嘲笑的函数 它接受一个参数对象作为参数 我想根据对象中的值返回结果 我无法比较对象 因为 Equals 未被覆盖 我有以下代码 tourDal Stub x gt x GetById Arg
  • 如何测试抽象类的受保护抽象方法?

    我一直在研究测试名为的抽象类的最佳方法TabsActionFilter 我保证继承自的类TabsActionFilter将有一个名为GetCustomer 在实践中 这种设计似乎效果很好 我遇到的一些问题是弄清楚如何测试OnActionEx
  • 使用RhinoMocks,我如何断言调用了几种方法之一?

    考虑以下服务接口 public interface IServiceA void DoSomething string s void DoSomething string s bool b public interface IService
  • 模拟 DBSet,EF 模型优先

    正如标题所说 我遵循模型优先方法 所以我的模型类是自动生成的 如果我想嘲笑DBContext衍生的MyModelContainer其中包含DBSets实体类 阅读一些内容 为了进行单元测试 您需要将其更改为IDBSet 是否可以做到这一点
  • Rhino Mocks:AAA Synax:断言属性已设置为给定类型

    我试图断言模拟对象中的属性是使用给定类型设置的 该属性具有抽象类型 并使用多种具体类型之一进行设置 这就是我想要做的 并且无论 Foo DoSomething 设置 Foo Bar 的值如何 它总是通过测试 Test public void
  • 使用 Rhino Mocks 模拟集合

    所以我猜这是很多人想做的事情 模拟集合 过去我用 Rhino 做过这样的事情 var col mock MockRepository GenerateMock

随机推荐