首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FactoryGirl Rspec实际上没有将记录保存到测试数据库中。

FactoryGirl Rspec实际上没有将记录保存到测试数据库中。
EN

Stack Overflow用户
提问于 2014-03-22 05:14:40
回答 1查看 2.3K关注 0票数 1

我正试图用FactoryGirl在Rspec中生成一个成功的测试。

规格文件:

代码语言:javascript
复制
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说它是创建的,而不是。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-22 09:51:09

在单元测试中,FactoryGirl和DB测试一般用于运行测试的DB的内部表示,并且没有提供关于在测试之外更改DB状态的保证。

正如您所描述的那样,您的体系结构在测试中调用REST。在respc中这是非常气馁的:

在测试运行期间对外部服务的请求可能导致以下几个问题:

  • 由于连接问题,测试间歇性失败。
  • 显着地减慢了测试套件.
  • 在第三方网站(如Twitter)上达到API速率限制。
  • 服务可能还不存在(只有它的文档)。
  • 服务没有沙箱或暂存服务器.

IMHO,您不应该将其测试为DB用例,而是作为RestClient用例,因为您的代码并不直接调用数据库,而是调用REST。

编写一个测试,它为测试的客户端存根REST,另一个测试,设置DB,测试REST的服务器端(测试REST调用接收预期结果)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22573769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档