2014-10-16 1 views
1

Я пишу тесты для представления рельсов, позволяет сказать, что мнение это что-то вроде:Как мне высмеять конкретный атрибут модели для проверки вида Rails?

show.json.rep

r.element :user, @user do |u| 
    r.element :id, u.id 
    r.element :somefield1, u.somefield1 
    // a lot of fields here 
    r.element :somefield100, u.somefield100 
end 

Теперь я хочу, чтобы проверить JSON он генерирует и просто интерес в поле id.

Если мой тестовый код написан как:

describe "show.json.rep" do 
    it "will generate json with correct id" do 
     assign(:user, mock(:user, :id=>111)) 
     render 
     puts "######### generate json:" 
     puts rendered 
     ... 
    end 
end 

Это будет отчеты такая ошибка:

Failure/Error: render 
    ActionView::Template::Error: 
     Mock :user received unexpected message :somefield1 with (no args) 

Я не хочу издеваться все поля, как somefieldX, что я не интерес, поэтому я попытался as_null_object:

describe "show.json.rep" do 
    it "will generate json with correct id" do 
     assign(:user, mock(:user, :id=>111).as_null_object) 
     render 
     puts "######### generate json:" 
     puts rendered 
     ... 
    end 
end 

На этот раз, он не сообщает эта ошибка, но странно, rendered значение null !!

######### generate json: 
null 

Я не уверен, почему и как его исправить? Или есть ли другой способ позволить мне просто предоставить интересующее поле?

ответ

0

Установка id при создании объекта, а затем вызов as_null_object приведет к тому, что id (и любой другой метод) вернет нуль.

Use the as_null_object method to ignore any messages that aren't explicitly set as stubs or message expectations.

Это, как вы бы окурок в id метод:

require 'json' 

describe "show.json.rep" do 

    let(:user) { double("User").as_null_object } 
    let(:json) { JSON.parse(rendered).symbolize_keys! } 

    before(:each) do 
    allow(user).to receive(:id).and_return(666) 
    assign(:user, user) 
    render 
    end 

    it "will generate json with correct id" do 
     expect(json[:id]).to equal (user.id) 
    end 
end 

Но в конечном счете, вы должны, вероятно, с помощью fixtures или factories вместо создания удваивает все более тестов. Я также предпочитаю использовать ActiveModel serializers, потому что они намного проще и быстрее тестируются, так как вы не кодируете и разбираете JSON.

Edit:

Другим решением является использование User.new

let(:user) { User.new(id: 666) }