2014-10-16 14 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(和任何其他方法)返回nil。

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 

但在長遠來看,你或許應該使用fixturesfactories,而不是設立雙打都在你的測試。 我也更喜歡使用ActiveModel serializers,因爲它們更容易和更快速地進行測試,因爲您不是編碼和解析JSON。

編輯:

另一種解決方案是使用User.new

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