问题标签 [moq]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
599 浏览

c# - 使用模拟框架记录拐点上的交互。起订量

问题的更新版本

你好。

我的公司有一些遗留代码库,我希望在它们迁移到 .NET 3.5 后立即对其进行测试。我选择了 Moq 作为我的 Mocking 框架(我立即爱上了简洁的语法)。

一个常见的场景,我希望在未来看到很多,是我看到一个与其他一些对象交互的对象。

我知道 Michael Feathers 的作品,而且我越来越擅长识别拐点和隔离尺寸合适的组件。提取和覆盖为王。

但是,有一个功能可以让我的生活变得更轻松。

想象一下 Component1 与 Component2 交互。Component2 是一些奇怪的串行线接口,连接到消防中心或类似的东西,具有大量的字节检查、转换和指针操作。我不想理解 component2 和 Component1 使用的遗留接口带来了很多包袱。

我想做的是提取 Component1 使用的 Component2 的接口,然后执行以下操作:

我正在创建一个普通的模拟,但我正在将真实 Component2 的一个实例作为构造函数参数传递到 Mock 对象中。看起来我正在根据 Component2 进行测试,但我不打算保留此代码。这是“放置测试对象”仪式的一部分。

现在,我将启动真实系统(连接物理火中心),然后与我的对象进行交互。

然后我希望检查模拟以查看组件 1 如何与组件 2 交互的日志(使用调试器检查模拟上的一些字符串集合)。而且,更好的是,该模拟可以提供一个期望列表(在 C# 中),它将在不依赖于 Component2 的模拟中创建此行为,然后我将在我的测试代码中使用它。

简而言之。使用模拟框架记录交互,以便我可以在我的测试代码中回放它。

旧版问题

你好。

使用遗留代码和许多实用程序类时,我有时会发现自己想知道在许多场景中特定类是如何被其周围环境所作用的。我今天早上处理的一个案例涉及对常规 MemoryStream 进行子类化,以便在达到一定大小时将其内容转储到文件中。

(我在这里使用了一个断点在文件写入后退出程序)。这行得通,我发现哪个 webform(web 部件->web 部件->web 部件)控件呈现不正确。然而,memorystream 有一堆 write 和 writeline。

我可以使用模拟框架快速了解特定实例的操作方式吗?有什么巧妙的技巧吗?我们使用 Rhino Mocks。

我认为这是处理遗留代码的重要资产。特别是如果可以轻松地将场景中记录的操作设置为在单元测试中复制的同一场景的新期望/接受标准。

每一个输入都受到赞赏。感谢您的阅读。

0 投票
2 回答
14731 浏览

c# - 需要帮助以更好地了解起订量

我一直在查看 Moq 文档,但评论太短了,我无法理解它可以做的每一件事。

我不明白的第一件事是It.IsAny<string>(). //example using string

使用它比仅仅投入一些价值有优势吗?我知道人们说如果你不关心价值就使用这个,但如果你不关心价值,你不能只做“a”之类的吗?这似乎更像是打字。

其次,什么时候是你不关心价值的例子?我认为起订量需要价值来匹配东西。

我根本不明白It.Is<>它的用途或如何使用它。我不明白这个例子以及它试图展示的内容。

接下来,我不知道何时使用Times(以及它的AtMost方法和类似的)。为什么要限制设置的次数?我有一些AppConfig价值需要使用两次。为什么我要将它限制为,比如说,一次?这只会使测试失败。这是为了阻止其他人在您的代码中添加另一个代码还是什么?

我不明白如何使用mock.SetupAllProperties(); 它设置属性的内容是什么?

我也不明白为什么有这么多不同的方式来设置属性以及它们的区别是什么。文档有:

我注意到 Moq 中的很多东西都显示了()-<>它们之间有什么区别,它们在使用中会是什么样子?

我也不明白为什么他们有SetupGet。你不会用SetupSet设置属性吗? SetupSet在文档中有五种不同的使用方式。再加上另一个叫SetupProperty. 所以我不明白为什么有这么多。

在旁注中,我想知道 lambdas 中使用的变量是否独立于其他 lambdas。例如:

这可以吗,还是变量之间会有一些冲突m

最后,我在看这个视频,我想知道它是否显示了 Visual Studio。他的 Intellisense 看起来不一样。一个灯泡为他弹出(我很高兴我的没有,因为它带回了对netbeans的痛苦回忆),并且从一个开口支架到闭合支架等都有线条。

0 投票
1 回答
2777 浏览

asp.net-mvc - 如何使用 Moq 对自定义 ModelBinder 进行单元测试?

我在编写一些单元测试来测试我创建的自定义 ModelBinder 时遇到了一些困难。我尝试进行单元测试的 ModelBinder 是我在此处发布的 JsonDictionaryModelBinder 。

我遇到的问题是使用 Moq 进行模拟所有设置。由于 HttpContextBase 未正确模拟,我不断收到 Null 异常。我认为。

有人可以帮我弄清楚我做错了什么吗?

这是我正在尝试编写但不起作用的单元测试示例:

这是上面使用的“FakeHttpContext”方法:

0 投票
1 回答
219 浏览

unit-testing - Moq 在设置模拟时会忽略命名空间吗?

第二个断言永远不会在下面的单元测试中执行:

看起来设置 Get<Bar.MyClass>() 会覆盖 Get<Foo.MyClass>() 的设置。这是否意味着 Moq 在设置 Get<T>() 时会忽略命名空间 Foo 和 Bar?有没有办法在不重命名 MyClass 类且不实现 IRepo 的情况下解决这个问题?我正在使用起订量 3.1.416.3。

更新:看起来这是为下一个版本修复的。

0 投票
2 回答
3060 浏览

unit-testing - 验证单元测试中是否调用了一种方法或另一种方法

例子:

如何在 Moq 中创建一个测试来验证:

  1. IsNew正在读取属性
  2. 或者Create()已经Update()被调用
0 投票
2 回答
261 浏览

nunit - 带有模拟验证的单元测试

我有一个单元测试

  1. 创建一个模拟
  2. 调用我的方法进行测试(也注入我的模拟)
  3. 断言方法结果
  4. 验证模拟呼叫

当模拟调用未按预期验证时,我得到一个异常,因此测试失败。
我应该如何正确调用此验证?我应该打电话吗

还是我应该用 Assert 来称呼它

当验证失败时,无论如何我都会遇到异常。
模拟验证的正确方法是什么?

0 投票
4 回答
600 浏览

unit-testing - 在单元测试中正确应用 Mock 对象

我有一个 PresenterFactory,它基于 Role 参数创建 Presenter 类。具体来说,角色参数是我无法控制的外部类(IE 3rd 方。)

我的工厂看起来像这样:

我被困在如何为此编写单元测试,因为创建Role对象会强制访问数据库。我以为我可以模拟这个对象。我的测试看起来像这样:

但是我收到一个ArguementException

不可覆盖成员上的无效设置:role=> role.IsUserA("Manager")

我不确定去哪里,当然可以使用一些课程修正。我究竟做错了什么?

0 投票
3 回答
1256 浏览

asp.net-mvc - 使用 Moq 模拟 HttpRequest 时设置 ServerVariable 值?

我正在使用 Moq 在 ASP.NET MVC 中进行单元测试来模拟 HttpRequest 对象。我需要在请求中设置一个 ServerVariables (LOGON_USER)。这可能吗?我曾尝试使用以下方法,但由于 ServerVariables 集合是不可覆盖的,因此出现异常。

是否可以设置一个 ServerVariable 值进行测试?

我是否需要传入一个新的 NameValueCollection 而不是尝试设置一个特定的键?

0 投票
2 回答
582 浏览

c# - 反映 Moq 对象会产生 2 个附加属性

我有几种方法可以使用反射从一种对象类型转换为另一种对象类型。我正在通过 Moq 测试转换方法,并且偶然发现了一种我不知道如何处理的行为。当我反映一个 Moq 对象以获取 PropertyInfo 时,我得到了两个额外的对象。

  • Moq.Mock``1[Namespace.Class+IElement] Mock
  • Moq.Mock Mock

重现此的代码如下:

有没有办法反映 Moq 对象而不检索这些属性?

0 投票
4 回答
10307 浏览

vb.net - 使用 Moq 模拟 VB.NET 方法

我正在尝试对使用成员资格提供程序更新用户详细信息的控制器操作进行单元测试。我正在使用迄今为止很容易使用的最小起订量。

问题是我似乎无法让它模拟对不返回任何内容的方法的调用。

模拟会员服务的设置不会编译,错误是:

重载解析失败,因为无法使用这些参数调用可访问的“设置”:

'公共功能设置(TResult)(表达式为 System.Linq.Expressions.Expression(系统.Func(服务.IMembershipService,TResult)))作为 Moq.Language.Flow.ISetup(Service.IMembershipService,TResult)' : 表达式不产生值。

'公共功能设置(TResult)(表达式为 System.Linq.Expressions.Expression(系统.Func(服务.IMembershipService,TResult)))作为 Moq.Language.Flow.ISetup(服务.IMembershipService,TResult)' :无法从这些参数推断类型参数的数据类型。明确指定数据类型可能会更正此错误。

'Public Function Setup(expression As System.Linq.Expressions.Expression(Of System.Action(Of Services.IMembershipService))) As Moq.Language.Flow.ISetup(Of Services.IMembershipService)':表达式不产生值。

我错过了什么?每当我的班级有我想调用的方法时,我是否必须创建一个假班级而不是使用 Moq?

编辑:

好的,一点点阅读表明这是由于 lambda 在 VB 中使用 Function() 表示的方式,它必须有一个结果。

有没有人找到解决这个问题的方法,或者我将不得不放弃起订量来伪造方法?