2010-09-06 3 views
0

Как мне спецификации этого вложенной сборка:Как ЗресЛ контекстный новый объект в контроллере

#projects_controller.rb 
def new 
    @account.projects.build 
end 

До сих пор у меня есть что-то вроде этого:

#projects_controller_spec.rb 
describe ProectssController do 
    describe "GET new" do 
    let(:account) { mock_model(Account) } 
    let(:project) { mock_model(Project).as_null_object } 

    before do 
     Account.stub(:find_by_subdomain!).and_return(account) 
     #Project.should_receive(:build).with(:account_id => account.id).and_return(project) 
    end 

    it "assigns @project" do 
     get :new 
     assigns[:project].should eq(project) 
    end 
    end 
end 

Не знаю, как я должен быть specing это ...

ответ

0

Уступка отсутствует в ProjectsController # new. Должно быть:

def new 
    # ... 
    @project = @account.projects.build 
    # ... 
end 

Затем вы можете окурок возвращения двойной, как вы хотели:

it "assigns @project" do 
    account = mock_model(Account) 
    Account.stub(:find_by_subdomain!).and_return(account) 
    project = account.stub_chain(:projects,:build) { mock_model(Project) } 
    get :new 
    assigns(:project).should == project 
end 
0

В целом, я рекомендую стучать и насмехаться как можно меньше. Я рекомендую использовать что-то вроде Factory Girl для создания реальных объектов базы данных для тестирования. Это означает, что Account и Project будут реальными классами ActiveRecord, а затем @account будет настоящим AR-объектом с ассоциацией projects, которая работает так же, как и в производстве. Это важно, поскольку в противном случае вы просто проверяете реализацию, которую вы написали, и на самом деле не проверяли, что ваш код функционирует, когда он фактически использует ActiveRecord.

После того, как вы можете сделать это, я бы рекомендовал просто проверить, что вы заботитесь о для модели проекта, например .:

assigns[:project].should be_instance_of(Project) 
assigns[:project].should be_new_record 
assigns[:project].account.should == logged_in_user 

Надеется, что это помогает!

Смежные вопросы