【问题标题】:Testing expectations on doubles in Sinatra app using spec使用规范在 Sinatra 应用程序中测试对双打的期望
【发布时间】:2013-04-23 21:24:54
【问题描述】:

我想验证是否在我想使用 rspec 注入 Sinatra 应用程序的服务上调用了一个方法,但我找不到如何完成此操作的示例。这是我的规格...

RSpec.configure do |config|
  config.include Rack::Test::Methods
end

def app
  App
end

describe 'Login' do
  context 'when the user is logged out' do
    describe 'POST on /signup' do
      it 'invokes signup on the user service with the correct parameters' do
        service = double('user_service').as_null_object
        service.should_receive(:signup).with(:username => 'RobA2345')
        post '/signup'
      end
    end
  end
end

这里的应用程序是一个模块化的 Sinatra 应用程序。我来自 .NET 背景,我会在这里使用构造函数注入来解决这个问题,但我知道这不是 ruby​​ 方法。

一如既往地感谢您的帮助。

【问题讨论】:

    标签: ruby rspec sinatra


    【解决方案1】:

    假设您希望在UserService 的新实例上收到消息,有几种方法可以做到这一点。如果您使用的是最新版本的 rspec,这应该可以:

    it 'invokes signup on the user service with the correct parameters' do
      UserService.any_instance.should_receive(:signup).with(:username => 'RobA2345')
      post '/signup'
    end
    

    或者,这应该适用于几乎任何版本的 rspec:

    it 'invokes signup on the user service with the correct parameters' do
      service = double('user_service').as_null_object
      UserService.stub(:new).and_return(service)
      service.should_receive(:signup).with(:username => 'RobA2345')
      post '/signup'
    end
    

    【讨论】:

    • 是的,确实有效。虽然我无法理解它,它只是感觉不对,但毫无疑问,我 10 年来一直处于一个一切都是明确的静态类型世界中。再次感谢,我相信我有一天会得到它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2015-09-05
    相关资源
    最近更新 更多