即使没有设置期望,为什么我的部分模拟会模拟所有虚拟方法?

2024-06-28

我有一个用户控件,它在我想测试的 ValidateChildren 方法中进行一些验证。我已经创建了用户控件的部分模拟,但是尽管我没有对 ValidateChildren 方法设置任何期望,但我只是简单地调用它,它只是被跳过,并且方法内的代码永远不会执行。为了尝试了解发生了什么,我创建了一个简单的测试,如下所示:

public class Foo
{        
    public virtual bool Method1()
    {
        throw new NotImplementedException();
    }

    public virtual bool Method2()
    {
        return Method1();
    }
}

并用它来测试它:

[Test]
public void TestFooMethods ()
{
    MockRepository m = new MockRepository();
    Foo foo = m.PartialMock<Foo>();

    RhinoMocksExtensions.Expect<Foo,bool>(
                             foo, 
                             delegate (Foo obj)
                             {
                                 return obj.Method1();
                             }
                         ).Return(true);

    Assert.IsTrue (foo.Method2());
}

现在我希望 foo.Method1 被嘲笑,而 foo.Method2 不会被嘲笑。但这总是返回 false,如果我尝试在调试器中单步执行,foo.Method2() 会被单步执行,并且我无法单步执行。

有什么想法吗?


如果您模拟一个对象,无论模拟的类型如何,它将覆盖所有抽象/虚拟方法。不过,您可以做的是对您的方法做出期望,并告诉它执行它所覆盖的原始方法,方法是:

CallOriginalMethod(OriginalCallOptions.CreateExpectation);

您没有按照设计方式使用 Rhino Mocks,这也可能会给您带来麻烦。我已经使用 C# 3.0 和 lambda 以及扩展方法按照应编写的方式重新编写了您的测试:

[TestMethod]
public void TestFooMethods()
{
    //Generate a new Mock to test against
    Foo foo = MockRepository.GenerateMock<Foo>();

    //Expect a call to Method1 on object foo and return true
    foo.Expect(f => f.Method1()).Return(true);
    //Expect a call to Method2 on object foo and call the original method
    foo.Expect(f => f.Method2()).CallOriginalMethod(OriginalCallOptions.CreateExpectation);

    Assert.IsTrue(foo.Method2());

    //Verify all our expectations on foo
    foo.VerifyAllExpectations();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使没有设置期望,为什么我的部分模拟会模拟所有虚拟方法? 的相关文章

  • C++:空类的对象的大小是多少?

    我想知道可能是什么空类对象的大小 肯定可以not为 0 字节 因为它应该可以像任何其他对象一样引用和指向它 但是 这样的物体有多大呢 我用了这个小程序 include
  • 提高mmap memcpy文件读取性能

    我有一个从文件中顺序读取数据的应用程序 有些是直接从指向的指针读取mmaped 文件和其他部分是memcpyed 从文件到另一个缓冲区 我注意到在进行大型操作时性能不佳memcpy我需要的所有内存 1MB 块 以及在执行大量较小操作时的更好
  • C# 在 WebBrowser 中调用 JavaScript

    我正在尝试调用 JavaScript 方法WebBrowser WebBrowser webBrowser new WebBrowser webBrowser NavigateToString html webBrowser LoadCom
  • 如何终止从cin读取?

    我已经尝试了这里列出的一堆方法 但没有一个起作用 它总是在等待更多的输入 我试过了while std getline std cin line 和下面的方法 似乎没有任何作用 include
  • 将 ManualResetEvent 包装为可等待任务

    我想等待手动重置事件 并超时并观察取消 我想出了类似下面的东西 手动重置事件对象由我无法控制的 API 提供 有没有办法在不占用和阻塞 ThreadPool 线程的情况下实现这一点 static Task
  • 以编程方式解析和编辑 C++ 源文件

    我想以编程方式解析和编辑 C 源文件 我需要更改 添加代码的某些部分 即函数 类块等 中的代码 我也 最好 能够得到评论 我想做的部分事情可以用下面的代码来解释 CPlusPlusSourceParser cp new CPlusPlusS
  • 将 .net 上的 AWS 开发工具包与 localstack 结合使用(TransferUtility/S3 - 设置端点)

    我有本地堆栈 https github com localstack localstack https github com localstack localstack 正在运行 并且能够使用 aws s3 cli 将文件上传到其中 我想要
  • ASP.NET身份更改密码

    我需要能够由管理员更改用户密码 因此 管理员不应输入用户的当前密码 他应该能够设置新密码 我查看了 ChangePasswordAsync 方法 但该方法需要输入旧密码 因此 此方法不适合此任务 因此我通过以下方式做到了 HttpPost
  • 异步方法调用和模拟

    为什么模拟用户上下文仅在异步方法调用之前可用 我编写了一些代码 实际上基于 Web API 来检查模拟用户上下文的行为 async Task
  • 是否有合法的方法使用运算符 << 打印元组和对?

    我有一组模板 函数 允许我打印元组 对 假设元组 对中的每种类型都有operator lt lt 为其定义的 不幸的是 由于 17 4 3 1 添加我的内容是非法的operator lt lt 重载到std 有没有其他方法可以让 ADL 找
  • 字符集中字符的顺序

    是否通过标准保证字符的顺序 例如 我可以算出字符集表中 1 符号后面跟着 2 符号吗 或者它是特定于平台的 1999 年的 C 标准对字符集是这样规定的 基本源字符集和基本执行字符集都应具有以下成员 拉丁字母表中的 26 个大写字母 拉丁字
  • 可以取消链接以读写方式打开的文件

    在我的程序 在 Mac OS X 上 中 我使用以下代码打开该文件 int fd fd open filename O RDWR 删除文件的程序如下 unlink filename 就我而言 我有相同的文件被打开和删除 我观察到以下情况 打
  • 将 make_shared 与可变参数模板绑定

    我正在尝试编写以下工厂类 但找不到正确的语法 template
  • 将 double 转换为 float 后值不正确

    我有一些由 gcc gcc GCC 4 4 4 20100726 Red Hat 4 4 4 13 编译的执行高精度算术的 C 代码 计算的最终结果是一个 double 值 其值为 622 07999995861189 我是将双精度型转换为
  • 实施黑名单的最有效方法

    我开发了一个 Ip 过滤器 并猜测我如何使用任何类型的 esque 数据结构开发一个非常高效且快速的黑名单过滤器 我想做的很简单 每个传入 传出连接我都必须检查被阻止的 IP 列表 IP是分散的 内存使用应该是线性的 不依赖于阻止列表的数量
  • 在 C# 中获取 Selenium RemoteWebDriver 的会话 ID

    我正在尝试获取在 SauceLabs 云上运行的测试的会话 ID 但我似乎无法访问它 我尝试过以下方法 Returns null var sessionId string RemoteWebDriver driver Capabilitie
  • 为什么将静态类内初始化成员传递给采用 const 引用的函数需要该成员有定义?

    这是基于最初提出的问题here https stackoverflow com questions 14547370 confusion about in class initialization of static data member
  • C# 泛型方法,new() 构造函数约束中的类型参数

    有没有办法创建一个使用的通用方法new 要求类具有特定类型的构造函数属性的约束 例如 我有以下代码 public T MyGenericMethod
  • 画笔和钢笔使用指南

    制作 GDI 画笔和钢笔有多贵 我应该在添加所需的基础上创建它们并将它们包装在 using 中以便快速处理它们 还是应该创建一个类似于 System Drawing Brushes 类的静态类 IMO 它们足够高效 您通常不应该创建在多个方
  • 选择数据结构

    根据需求使用不同的数据结构 但我如何知道应该使用哪种数据结构 我只是想知道如何选择合适的数据结构 谢谢 此流程图适用于 C 中的 STL 但您可以用 C 实现 STL 容器支持的任何数据结构 列表是一个链接列表 Vector是一个动态数组

随机推荐