问题标签 [mocking]

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 投票
3 回答
2430 浏览

c# - 将 Web 上下文传递给 ASP MVC 应用程序中的“服务”

我正在尝试找出一种将 Web 当前 http 上下文传递给服务类(或使用对它的引用来初始化类)的方法。我这样做是为了将应用程序的其余部分从需要了解有关 http 上下文的任何信息中抽象出来。

我还希望该服务可以使用 TDD 进行测试,可能使用 Mockable 框架之一。因此,最好使用接口而不是实际的类。

我想实现的一个例子:

我遇到的主要问题之一是没有 IHttpContext,.net http 上下文是无法模拟的抽象类的子类(容易吗?)。

另一个问题是我无法初始化类的全局实例,因为上下文与大多数请求无关。

我可以使类静态,并要求将上下文传递给每个函数,因为它被称为即

但这并没有使这个类更容易测试,我仍然需要创建一个 HttpContext 并且另外任何想要使用这个类的非 Web 感知服务突然需要能够检索要求它们紧密耦合的 Context到网络服务器——首先想要创建这个类的全部原因。

我对所有建议持开放态度——尤其是那些人们知道有助于轻松进行 tdd 测试的建议。人们会建议我如何解决这个问题?

干杯

0 投票
5 回答
30054 浏览

c# - 如何最小起订量索引属性

我试图模拟对索引属性的调用。即我想起订量以下:

以及设置器值

我这样做是因为我需要模拟我的应用程序使用的类的功能。

有谁知道如何用最小起订量做到这一点?我尝试了以下变体:

但这不编译。

我想通过最小起订量实现什么,有人有我如何做到这一点的例子吗?

0 投票
1 回答
4575 浏览

.net - Rhino Mocks - 为非虚拟方法设置结果

我正在玩 Rhino Mocks,并试图在我的模拟对象上设置一些虚拟结果,所以当它们在我的工厂方法中被调用时,我不必担心数据。

但是我遇到了一个障碍,我想要获得虚拟结果的方法会导致异常,因为它们不是virtual

我有这样的代码:

SomeMethod方法是否必须是虚拟的才能获得模拟结果?

SetupResult.For另外,和有什么区别Expect.Call

0 投票
6 回答
7672 浏览

php - 在 PHPUnit 中模拟对象以模拟静态方法调用?

我正在尝试测试一个管理数据库中数据访问的类(本质上是 CRUD)。我们使用的 DB 库恰好有一个 API,您首先通过静态调用获取表对象:

...你明白了。

我们正在尝试测试此方法,但要模拟 DataObject 的东西,以便 (a) 我们不需要实际的数据库连接来进行测试,并且 (b) 我们甚至不需要包含 DB_DataObject 库来进行测试.

但是,在 PHPUnit 中,我似乎无法让 $this->getMock() 适当地设置静态调用。我有...

...但测试仍然显示未知方法“工厂”。我知道它正在创建对象,因为在它说找不到 DB_DataObject 之前。现在可以了。但是,没有办法吗?

我真正想做的是有两个模拟对象,一个也用于返回的表对象。所以,我不仅需要指定 factory 是一个静态调用,还需要它返回一些我已经设置的指定的其他模拟对象。

我应该提醒一下,我不久前在 SimpleTest 中做过这个(找不到代码)并且效果很好。

是什么赋予了?

[更新]

我开始明白它与expects()有关

0 投票
14 回答
240383 浏览

unit-testing - 伪造,嘲笑和存根之间有什么区别?

我知道我如何使用这些术语,但我想知道是否有公认的fakingmockingstubbing定义用于单元测试?你如何为你的测试定义这些?描述您可能使用每种情况的情况。

以下是我如何使用它们:

Fake:实现了接口但包含固定数据且没有逻辑的类。根据实现简单地返回“好”或“坏”数据。

Mock:一个实现接口并允许动态设置值以返回/异常以从特定方法抛出的能力并提供检查特定方法是否已调用/未调用的能力的类。

Stub:类似于模拟类,只是它不提供验证方法是否已被调用/未调用的能力。

模拟和存根可以手动生成或由模拟框架生成。假类是手工生成的。我主要使用模拟来验证我的类和依赖类之间的交互。一旦我验证了交互并通过我的代码测试备用路径,我就会使用存根。我主要使用假类来抽象出数据依赖关系,或者当模拟/存根太繁琐而无法每次设置时。

0 投票
3 回答
91396 浏览

c# - 使用 Moq 确定是否调用了方法

据我了解,如果我调用更高级别的方法,我可以测试是否会发生方法调用,即:

我想测试一下,如果我打电话,SomeMethod()那么我希望SomeOtherMethod()会被调用。

我认为这种测试在模拟框架中可用吗?

0 投票
2 回答
6506 浏览

unit-testing - Moq-ing 类或接口有什么区别?

我一直在使用moq在我的单元测试中模拟对象,并且我在网站上看到关于 moq 的信息,它能够模拟类和接口。

前几天我和我的一个同事讨论过,他们说没有理由模拟类,我应该只模拟接口。

我对此并没有真正的答案....而且我似乎也无法在起订量网站上找到任何答案。

一个人永远不应该模拟课程,这是真的吗?我会说不,因为如果这是真的,那么 Moq 甚至都不会允许它......那么有没有时候在接口上模拟一个类更好?模拟类与模拟接口有什么区别?或者它真的只是一种偏好?

0 投票
4 回答
4162 浏览

python - 尽管极度懒惰,我如何在 Python 中模拟 IMAP 服务器?

我很想知道是否有一种简单的方法可以imaplib在 Python 中模拟 IMAP 服务器(一个模块),而无需做很多工作。

有预先存在的解决方案吗?理想情况下,我可以连接到现有的 IMAP 服务器,进行转储,然后让模拟服务器脱离真实的邮箱/电子邮件结构。

懒惰的一些背景:我有一种讨厌的感觉,我正在编写的这个小脚本会随着时间的推移而增长,并且想创建一个合适的测试环境,但考虑到它可能不会随着时间的推移而增长,我不想这样做让模拟服务器运行需要做很多工作。

0 投票
3 回答
13401 浏览

java - JMockit 中有没有办法从模拟方法调用原始方法?

在我的模拟类中,我正在模拟方法 foo()。对于某些测试用例,我希望 foo() 的模拟实现返回一个特殊值。对于其他测试用例,我想使用 foo() 的真正实现。我在我的模拟类中定义了一个布尔值,以便我可以在模拟方法中确定是要返回特殊值还是使用“真实”方法。问题是,我似乎无法弄清楚如何从模拟方法中调用真正的方法。

我发现您可以在名为“it”的模拟对象中定义一个特殊成员(具有被模拟对象的类型)。这允许您从模拟实现中引用真实的类。所以,我的计划是,如果我需要调用 foo() 的“真实”实现,模拟方法将调用 it.foo()。但是,这不起作用,因为调用 it.foo() 只是再次调用模拟版本,而不是真实版本,所以我最终得到了无限递归。

有什么办法可以使这项工作?

编辑:使用代码示例可能会更清楚,这是我当前的模拟方法实现的样子:

编辑 2:另外,对于我的大多数测试用例,我想要模拟实现。所以我最初的尝试是只在我需要模拟对象的那些测试用例中调用 Mockit.redefineMethods() 。但这不起作用 - 似乎你只能在 setup/teardown 中做到这一点......当我尝试这样做时,我的模拟实现从未被调用过。

解决方案注意事项:

起初我不认为给出的答案有效,但在玩了一些之后,似乎问题在于我将 JMockit “核心”方法与“注释”驱动方法混合在一起。显然,在使用注释时,您需要使用 Mockit.setupMocks,而不是 Mockit.redefineMethods()。这就是最终奏效的方法:

然后,对于模拟类:

0 投票
4 回答
2150 浏览

unit-testing - 使用 ExpectSet() 和 It.Is 进行最小起订量测试() 的行为不符合...预期

我已将行为隔离到以下测试用例中。我会感谢任何能告诉我如何期待/验证属性集的人List<T>- 似乎里面发生了一些事情,It.Is<T>(predicate)现在对我来说没有多大意义。示例代码将作为 VS2008 中的控制台应用程序运行 - 您需要添加对 Moq 2.6 的引用(我在 2.6.1014.1 上) - 请尝试取消注释不同的 ExpectSet 语句以查看发生了什么...