2014-11-03 68 views
0

控制器:测试失败,如果:Rspec的受让人失败上增加更多的代码

def index 
    @products = Product.all 
    @products.present? ? @no_products_found = "" : @no_products_found = "No Products available." 
end 

失败消息: 预期:2 得到:0

(compared using ==) 

Rspec的:

it "assigns products" do 
    get :index 
    FactoryGirl.create(:product, name: "product 1") 
    FactoryGirl.create(:product, name: "product 2") 
    expect(assigns(:products).size).to eq(2) 
end 

如果我将动作更改为:

def index 
    @products = Product.all 
end 

PS:新的导轨。感谢您的输入。

+0

什么是您从RSpec获得确切的失败消息? – 2014-11-03 17:19:48

+0

预计:2得到:0(使用==比较) – AdRoiT 2014-11-03 17:22:01

+1

你正在清理你的数据库吗?我希望'get:index'行之前的'FactoryGirl'行。 – BookOfGreg 2014-11-03 17:24:34

回答

1

你需要做get之前调用FactoryGirl.create。当然,记录必须在提出请求之前存在。

it "assigns products" do 
    FactoryGirl.create(:product, name: "product 1") 
    FactoryGirl.create(:product, name: "product 2") 
    get :index 
    expect(assigns(:products).size).to eq(2) 
end 

虽然我亲自做的规范一点更加明确:

it "assigns products" do 
    get :index 
    products = [ 
     FactoryGirl.create(:product, name: "product 1"), 
     FactoryGirl.create(:product, name: "product 2") 
    ] 
    expect(assigns(:products)).to eq(products) 
    end 
end 

再有就是你的控制器动作的另一个问题。应谨慎使用三元条件运算符,在这种情况下,我强烈建议不要使用它,因为它会妨碍可读性。这条线:

@products.present? ? @no_products_found = "" : @no_products_found = "No Products available." 

应该再次写成

@no_products_found = @products.present? ? "" : "No Products available." 

甚至

@no_products_found = if @products.present? 
         "" 
        else 
         "No Products available." 
        end 

,我个人不喜欢乱用这种简单的观点的逻辑我的控制器动作。也许它只用在一个地方,所以我的解决方案将完全位于视图层:

<% if @products.present? %> 
    <% @products.each do |product| %> 
    <!-- Render products --> 
    <% end %> 
<% else %> 
    No products available. 
<% end %> 
+0

哇,谢谢!这很有帮助。 – AdRoiT 2014-11-03 17:33:01

+0

一个稍微偏离主题的问题 - 如果我在视图中添加逻辑,那么,如果页面显示“没有产品可用”,我将如何测试。或不。我尝试了should_have_content,但这并不像预期的那样工作 – AdRoiT 2014-11-03 17:42:37

+0

您可以对呈现的主体执行断言,例如'expect(response.body).to include('No results found')'。您可能还想看看水豚的功能规格。这些测试可以在后台启动一个真实的网络浏览器来模拟用户交互。它们非常适合端到端测试,但我喜欢仅仅为了核心功能而少数几个,因为它们往往会变慢。 – 2014-11-03 21:49:44

1

这是因为您在调用索引方法后创建产品。更改规格,以这样的:

it "assigns products" do 
    FactoryGirl.create(:product, name: "product 1") 
    FactoryGirl.create(:product, name: "product 2") 
    # created products above and then make call to index: 
    get :index 
    expect(assigns(:products).size).to eq(2) 
end 
+0

甜,我刚刚发现并准备发布答案。但是,为什么它通过第一种情况? – AdRoiT 2014-11-03 17:27:07

+0

@AdRoiT:我很抱歉,但我没有看到您的帖子上写有任何其他案例。你想写吗? – Surya 2014-11-03 17:28:47

+0

当我定义索引def index时,运行相同的测试 @products = Product.all end – AdRoiT 2014-11-03 17:39:03