我正试图用FactoryGirl在Rspec中生成一个成功的测试。
规格文件:
require 'spec_helper'
describe Manager::Synchronization do
it "contains all parameters" do
build_stubbed(:synchronization, elapsed_time: nil).should_not be_valid
build_stubbed(:synchronization, updated_records: nil).should_not be_valid
end
it "processes asset downloads" do
# Normally created via delayed_job calling method download_assets_for,
# we are going to do it right now instead
p = create(:photograph)
s = build(:synchronization)
puts "SLEEPING"
# By this point, the Photograph has been saved and should appear
# in the test database. If I write below: puts Manager::Photograph.all.inspect,
# it gives me a result set that shows the Photograph was indeed saved
# to the database. However s.download_assets_for(p.class, p.id) raises an
# error ("Couldn't find Manager::Photograph at id:1").
sleep 10
# Expect no errors if the instance should be found
expect { s.download_assets_for(p.class, p.id) }.to_not raise_error
# Expect this error
expect { s.download_assets_for(p.class, 0) }.to raise_error(RuntimeError, "Couldn't find #{ p.class } at id:0")
end
end正如我在spec文件中的注释所说明的,我通常期望在一个模型上调用download_assets_for不会引起错误,所有帐户都应该存在该模型。download_assets_for使用RestClient对‘主’服务器进行API调用--在本例中,这个应用程序包含相同的测试数据库;我刚刚将照片保存到的应用程序。它向调用它的方法发送一个响应。但是,当服务器收到请求(由RestClient发送)时,创建的照片不会出现在数据库中。我已经通过在睡眠10期间刷新MySQL工作台中的MySQL查询来确认这一点。
因此,总结一下: Rspec告诉我,当它真的不在的时候,记录就被保存了。我必须修改我的download_assets_for方法来检查我是否在测试环境中,并且只返回一个不同的结果,而不是使用RestClient --但这感觉像是一个粗略的解决方法。主要问题是:为什么Rspec说记录是存在的,而实际上它并不存在?
测试我所说的最简单的方法是:
1)打开MySQL工作台,然后转到测试数据库/表,然后查看所有行。A这一点不应该有行,因为测试数据库应该是空的。
2)进行Rspec测试,在测试中使用FactoryGirl's create call (或者是Rspec?)
3)在调用create之后,puts刚刚创建的记录。它应该显示是被拯救的。
4)然后立即进行睡眠调用,这样您就可以手动单击MySQL工作台并重新加载查询。你不应该在里面看到任何记录。也就是说,Rspec说它是创建的,而不是。
发布于 2014-03-22 09:51:09
在单元测试中,FactoryGirl和DB测试一般用于运行测试的DB的内部表示,并且没有提供关于在测试之外更改DB状态的保证。
正如您所描述的那样,您的体系结构在测试中调用REST。在respc中这是非常气馁的:
在测试运行期间对外部服务的请求可能导致以下几个问题:
IMHO,您不应该将其测试为DB用例,而是作为RestClient用例,因为您的代码并不直接调用数据库,而是调用REST。
编写一个测试,它为测试的客户端存根REST,另一个测试,设置DB,测试REST的服务器端(测试REST调用接收预期结果)。
https://stackoverflow.com/questions/22573769
复制相似问题