【问题标题】:Mocking the model and its methods模拟模型及其方法
【发布时间】:2014-08-13 07:11:39
【问题描述】:

谁能告诉我我的方法是否合适?

我想知道我们正在使用的 api 是否按设计工作以及何时发生变化,因此我们知道它已经发生了变化,而无需深入研究所有 code 逻辑。我们将提供一组参数,我们期望得到一定的结果,以便我的单元测试运行良好。

User.login({email: username, password: password);

我的模型中的上述方法实际上命中了 API 并返回了一个响应。我想检查我的模型的登录方法是否按预期工作。

下面是我的approach

我在我的模型中使用所需的参数和预期的响应来存根我的登录方法,以避免点击 api,然后期待 login 方法与 derive 相同的响应。 我正在使用 ActiveRestClient。

下面是我的模型

class User << ActiveRestClient::Base
  get :all, '/user'
  get :find, '/user/:id'
end

以下是我的规格

require 'spec_helper'

describe User do 

  let(:username) {"test@test.com"}
  let(:password) {"123"}

  context "when signing in" do 
    let(:response) {{token: "123"}.to_json}

    it "should sign in with valid input" do 
      allow(User).to receive(:login).with({email: username, password: 
           password}).and_return(response)
      expect(User.login({email: username, password: passwor})).to eq(response)
    end

  end

end

谁能告诉我我的方法是否合适?

【问题讨论】:

  • 不,很抱歉,您的方法不好。因为它不测试一行代码。您的规范唯一要测试的是 User.login 存根返回您告诉它返回的内容。

标签: ruby-on-rails ruby ruby-on-rails-3 unit-testing rspec


【解决方案1】:

不,很抱歉,您的方法不好。因为它不会测试我们的任何一行代码。您的规范唯一测试的是 User.login 存根返回您告诉它返回的内容。

如果您想通过存根方法来加快规范,那么您应该在您的方法中查找涉及数据库的调用。在以下示例中类似于User.find_by_email (我猜你在login 方法中做了类似的事情)。

此外,如果emailpassword 不匹配,您可能希望指定发生的情况。

describe User do 
  describe 'login' do
    let(:username)  { "test@test.com" }
    let(:password)  { "password" }
    subject(:login) { User.login(email: username, password: password) }

    context 'when user do not exists' do
      before { allow(User).to receive(:find_by_email).and_return(nil) }

      it 'returns nil' do
        expect(login).to be_nil
      end
    end

    context 'when user exists' do
      before do
        allow(User).to receive(:find_by_email).with(username).and_return(user)
      end

      context 'when password does not match' do
        let(:user) { User.new(:password => 'wrong password') }

        it 'returns nil' do
          expect(login).to be_nil
        end
      end

      context 'when password matches' do
        let(:user) { User.new(:password => password, :generate_token => 123) }

        it 'returns a json containing the signin token' do
          expect(login).to eq "{'token':'123'}"
        end
      end
    end
  end
end

由于我不知道您的 login 方法的真正作用是什么,所以上面的所有规范都只是基于假设,并且很可能不会通过您的实现。但我希望你明白这一点。

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2020-09-11
    • 2016-04-18
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多