Насмешка над моделью и ее методами

Кто-нибудь может сказать мне, подходит ли мой подход?

Я хочу знать, что 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) {"[email protected]"}
  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

Кто-нибудь может сказать мне, подходит ли мой подход?


person UnderTaker    schedule 13.08.2014    source источник
comment
Нет, извините, ваш подход не подходит. Потому что он не проверяет ни одной строки кода. Единственное, что проверяет ваша спецификация, это то, что заглушка User.login возвращает то, что вы сказали.   -  person spickermann    schedule 13.08.2014


Ответы (1)


Нет, извините, ваш подход не подходит. Потому что он не проверяет ни одной строки нашего кода. Единственное, что проверяет ваша спецификация, это то, что заглушка User.login возвращает то, что вы сказали.

Если вы хотите ускорить свои спецификации с помощью методов-заглушек, вам следует искать вызовы в вашем методе, которые касаются базы данных. Что-то вроде User.find_by_email в следующем примере (и я думаю, вы делаете что-то подобное в своем методе login).

Кроме того, вы можете указать, что требуется, если email или password не совпадают.

describe User do 
  describe 'login' do
    let(:username)  { "[email protected]" }
    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, все приведенные выше спецификации основаны только на предположениях и, скорее всего, не пройдут с вашей реализацией. Но я надеюсь, вы уловили суть.

person spickermann    schedule 13.08.2014