【问题标题】:Have rSpec check if an object was able to be created?让 rSpec 检查是否能够创建对象?
【发布时间】:2011-10-19 21:51:07
【问题描述】:

我对 rspec 非常陌生,我正在尝试编写一个测试来确保创建的对象确实存在。这是我的测试现在的样子:

require 'spec_helper'

describe "UserService" do
  describe ".new" do
    it "should create a UserService object" do
      service = UserService.new
      service.should_not be_nil
    end
  end
end

问题是,我在运行测试时得到了这个输出:

  1) UserService.new should create a UserService object
     Failure/Error: service = UserService.new
     Errno::ECONNREFUSED:
       Connection refused - connect(2)
     # ./spec/requests/user_service_spec.rb:6:in `new'
     # ./spec/requests/user_service_spec.rb:6:in `block (3 levels) in <top (required)>'

我预计此时连接会被拒绝,但我怎样才能测试它而不是破坏测试呢?或者,我看到的是正确的输出吗?谢谢!

【问题讨论】:

  • 我们需要更多关于UserService 的信息。为什么它连接到某个地方?
  • 不确定这是否真的相关。我要测试的只是确保它成功连接。这应该适用于任何事情,无论服务实际做什么。我知道连接失败的原因,并对其进行了修复,但我正在尝试测试如何针对这种情况(无法连接)正确地进行测试失败
  • 您是在问如何在 rSpec 中测试异常,即测试需要异常,如果抛出异常,则测试成功?
  • 我想我自己找到了在 rspec 中执行此操作的最佳方法。我的问题是在 UserService.new 无法访问用户服务时抛出错误(服务器已关闭)。我将测试中的两行替换为:UserService.new should_not raise_error

标签: ruby-on-rails rspec rspec2 rspec-rails


【解决方案1】:

我发现这有两个问题。首先,您实际上是在尝试连接到测试中的外部服务。通常,您希望为被测对象提供某种模拟,该模拟代表您通常连接到的服务。我猜测您在问题和 cmets 中的内容,您的代码需要进行以下更改才能正常工作:

您需要构建一个外观或代理对象来“隐藏”您的 UserService 对象的真实服务。该对象基本上应该只是一对一地映射底层服务。这样做的原因是您不希望我们的内部紧密绑定到外部服务,您希望它们绑定到您的对象(并且永远不会紧密)。外观不应该进行单元测试,这会让你回到现在的位置,并且不需要进行单元测试,因为它不包含任何业务逻辑。

第二件事是您需要依赖反转来将您的 UserService 对象与特定的底层服务实现解耦。您希望您的 UserServices 构造函数获取一个对象、任何对象,并在其上调用方法来完成与服务相关的工作。由于您的 UserService 不再关心它是否是真正的服务(它不应该),您可以在测试期间为其提供一个简单的存根,而不必在外部服务缓慢或停机或以任何其他方式中断测试行为异常。

第二件事是您使用should_not raise_error 忽略了测试中的特定情况。可以将它与指定的错误一起使用,例如 should_not raise_error(ConnectionError),但是当您无法自救时抛出错误是很正常的事情,如果您稍后添加此行为,您的测试就会中断。

测试表明您应该在调用UserService.new() 时取回一个 UserService 对象,它没有提到如果......在这种情况下正确测试并记录预期行为应该做的事情是在您现在拥有的测试中为其提供一个工作模拟,并创建第二个测试,例如:

describe ".new" do
  it "when service is down should throw error" do
    UserService.new(offline_mock).should raise_error(ConnectionError)
  end
end

只是关于如何在这种情况下不结束的一些想法;)像往常一样,测试中的问题通常是架构问题的征兆。

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 2023-03-30
    • 2011-02-04
    • 2021-12-24
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多