问题标签 [rspec-mocks]

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 投票
1 回答
705 浏览

ruby - RSpec:使用`receive ...完全... with ... and_return ...`和不同的`with`参数

我正在编写一个期望,它检查一个方法是否使用不同的参数被调用两次并返回不同的值。目前我只是写了两次期望:

我想知道我是否可以receive ... exactly ... with ... and_return ...改用;就像是:

上面的代码不起作用,它会引发以下错误:

有没有办法使用receive ... exactly ... with ... and_return ...不同的with论点?

0 投票
2 回答
303 浏览

ruby - 如何存根从构造函数调用的全局函数?

我试图存根从构造函数调用的全局函数。我正在使用 Rspec 和 Rspec-mocks。这是要测试的代码:

这是测试:

测试失败并显示以下消息:

如何存根全局函数foo

PS:如果从另一个全局函数调用,则按expect(self).to receive(:foo) { 'bar' }预期工作。foo

0 投票
2 回答
1654 浏览

ruby - 如何使用带有 RSpec 模拟的冰糕类型检查?

我有一个具有冰糕类型签名定义的方法。尝试在使用 RSpec 的测试中模拟此方法时,出现类型不匹配错误。我正在尝试了解如何解决此问题,并且可以添加基于 RSpec 的测试而不影响冰糕类型检查。

测试代码:

错误:

0 投票
3 回答
324 浏览

ruby - 在测试结束之前验证 rspec 模拟

似乎在测试用例中使用 rspec 模拟的标准方法是执行以下操作:

行得通。但是,如果SomeClass.call_bar使用 return offoo.bar作为返回,并且代码有问题,以至于foo.bar从未调用过,那么我只会收到由于该assert_equal(42, ret)行导致的失败。我没有看到任何错误,例如:

如果我删除该assert_equal(42, ret)行,那么我会得到 rspec 期望错误。但是我想验证这两件事,foo.bar即被调用最终返回为 42。更重要的是要知道foo.bar没有调用,因为这是没有返回 42 的原因。

如果我期待类似:expect(foo).not_to receive(:bar),那么我确实在调用的源头得到了那个期望错误,而不是在拆解的后期。

现在,我可以::RSpec::Mocks.verify在调用 to 之前执行 put 之类的操作assert_equal,但这感觉不对。我也不确定我是否应该在这一点上清理模拟。

是否有一些语法,例如:

这样验证会在块传递给during? 或者,如果您有多个双打,您可以执行以下操作:

0 投票
1 回答
58 浏览

unit-testing - 如何对不调用 RSpec 中另一个对象方法的方法进行单元测试

我有一个 Rails 控制器,我想测试一个方法test_method

我必须测试call_method没有被调用。这是我想出的,但我认为这不会奏效。

在这里关注了这个问题,发现它几乎相似,只是被调用的方法在另一个类中。当我尝试上面的代码时,我收到一条错误消息,例如“预期对象要响应has_received?

我相信我将无法使用给定的设置对此进行测试,因为用户没有被注入test_method.

call_method是对将作业排入队列的方法的调用,因此我想确保它不会被调用。

我将如何测试这种方法?

0 投票
0 回答
116 浏览

ruby-on-rails - Rspec:声明一个变量,该变量将作为记录创建到方法中

我对 Rails 很陌生,但我似乎面临着一个我无法解决的问题。我正在尝试测试将创建新记录并稍后使用它来实例化新服务的后台作业。

当我正在测试后台作业时,似乎我应该在测试之前将这项服务加倍,但是其中一个参数是在作业中创建的,使用在作业中创建的另一条记录作为参考。因此,每次我尝试运行它时,ID 总是会有所不同。

这是示例代码:

如您所见,VideoPerformanceReportService 使用 result_slot 作为参数,该参数在作业内部创建,使用 history_log(也在作业内部创建)作为参考。

我该如何测试呢?

(提前感谢大家的帮助)

0 投票
1 回答
729 浏览

ruby-on-rails - 如何使用 RSpec 检查一个方法是否调用了另一个方法

我有以下代码结构(长度缩写):

目前,我可以指定调用executeRSpec 中的方法以确保upload_file被调用。但是,我如何模拟检查upload_file调用upload_content

0 投票
1 回答
416 浏览

ruby-on-rails - 如何测试 Sidekiq 工作人员是否将正确的数据发送到外部 API?

我有一个 Sidekiq 工作人员,它通过外部 API 获取一些数据。我正在尝试编写测试以确保该工作人员的设计和功能正常。工作人员抓取一个本地模型实例并检查模型上的两个字段。如果其中一个字段是nil,它会将另一个字段发送到远程 API。

这是工人代码:

我想编写一个测试以确保如果文章内容为零,则文章摘要就是发送以进行编码的内容。

我的假设是,这样做的“正确”方法是模拟法拉第的响应,以便我期望对特定输入的特定响应。通过创建包含nil内容和摘要的文章,x我可以模拟对发送x到远程 API 的响应,并模拟对发送nil到远程 API 的响应。我还可以创建一篇文章,其中x包含摘要、z内容和模拟响应z

我写了一个一般模拟法拉第的测试:

但这模拟了法拉第 100% 的使用:post。在我的特殊情况下,我不知道如何模拟:post特定身体的反应......

我也有可能要测试这一切都是错误的。相反,我可以测试我们是否发送了正确的内容(测试应该检查法拉第发送的内容)并完全忽略正确的响应。

测试该工作人员是否做正确事情的正确方法是什么(发送内容,或者如果内容为 nil 则发送摘要)?是测试发送的内容,还是测试我们返回的内容以反映发送的内容?

如果我应该测试返回的内容以反映正在发送的内容,我如何根据发送给它的东西的价值来模拟法拉第的不同响应/

** 稍后添加注释 **

我做了更多的挖掘和思考,好吧,让我测试一下我正在发送我期望的请求,并且我正在正确处理响应。所以,我尝试使用 webmock。

但我认为 webmock 并没有在 sidekiq 工作中被选中,因为我明白了:

如果我尝试webmock/rspec在其他任何地方包含,例如,在我的文件的开头,随机的东西就会开始爆炸。例如,如果我在这个规范文件的开头有这些行:

然后我得到:

我猜这是因为测试套件正在尝试初始化东西,但 webmock 正在干扰......

0 投票
1 回答
46 浏览

ruby - 模拟 ruby​​-core 类的正确方法

我想知道这个解决方案是否通过在 ruby​​ 中模拟对象得到社区的认可。如果不是,请描述原因,以及如何改进代码设计或测试。

考虑我有以下代码。

lib/config_loader.rb

在测试时,我实际上不希望在path我在变量中定义的内容下创建任何东西,所以我只想模拟这种行为

spec/lib/config_loader_spec.rb

也许我应该做一些class_double课程File。我不确定我提供的方式,所以我需要一些信息如何以常见/最佳实践的方式进行

0 投票
1 回答
355 浏览

ruby - 期望模拟结果接收方法

我正在尝试模拟一个类,以便我可以期望它被实例化,然后调用某个方法。

我试过了:

但我得到的只是:

未定义的方法“显示?” 对于#RSpec::Mocks::VerifyingMessageExpectation:0x0055e9ffd0b530

我试过提供一个块并首先调用原始方法(:new 和 :show?,我必须先绑定),但错误总是一样的。

我知道expect_any_instance_of,但它被认为是代码气味,所以我试图找到另一种方法来正确地做到这一点。

背景:我有权威政策,我想检查它是否被调用

我也试过了,同样的错误: