【发布时间】:2017-12-21 09:46:46
【问题描述】:
现有的 Ruby 代码:
def book_details
book_count = Book.count
while (book_count > 1)
# Do something
end
end
我想编写 rspec 测试用例,在 book_details 函数中设置 book_count 值。是否可以?如果是,怎么做?
到目前为止,我尝试过的是:
it 'Should return 1 book details only' do
allow(Model).to receive(book_count).and_return(1)
# Do something
end
但这会给出错误“未定义的局部变量或方法 `book_count' for #
【问题讨论】:
-
试试
allow(Book).to receive(:count).and_return(1)。 -
如果您发现自己在测试实现的内部结构(包括但不限于:私有函数、局部变量等),那么您做错了,您必须审查整个设计。在这里,我相信正确的测试是: 1. 创建一个 single
Book实例,测试。 2.创建两个Book实例,测试。 -
谢谢@ndn - 它就像一个宝石。
-
但在这种情况下它很好。反正有设置局部变量吗?可以说 book_count = 1000 存在于红宝石代码中。我想用 rspec 将它重置为 10。
-
@Sk.Irfan 除了
ndn的答案之外,使用allow(Book).to receive(:count).once.and_return(1)会更安全,因为您希望它只被调用一次,否则可能会在某个地方Book.count在该特定测试执行中被多次调用,您不想在其他测试中意外覆盖Book.count的值。
标签: ruby-on-rails ruby unit-testing rspec