测试唯一性验证

时间:2016-09-06 08:54:41

标签: ruby-on-rails ruby rspec rspec-rails

我试图学习rspec并遇到问题,我试图在我的某个模型上测试唯一性验证,但即使我非常确定,测试也会失败它应该通过。

这是我的测试:

  context "two products with the same title" do
    Given{FactoryGirl.build(:product, title: "Hello test title")}
    Given(:post2){FactoryGirl.build(:product, title: "Hello test title")}
    Then{post2.invalid?}
  end

这是我的验证器:

validates :title, uniqueness: true

然而,当我进行测试时,它返回失败,我不确定为什么?

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:2)

您需要在<t t-call="report.html_container"> <t t-foreach="docs" t-as="o"> <t t-call="report.external_layout"> <div class="page" > <br></br><br></br> <div class="row" style="border: 1px solid black"> <div class="col-md-12 text-center"><h2>JOURNAL DE PAIE</h2></div> <div class="col-md-12 text-center"><p>Période du <span t-esc="data['form']['date_start']"/> au <span t-esc="data['form']['date_end']"/></p></div> </div> <br></br><br></br> <div class="row"> <table class="table table-striped table-bordered table-condensed table-hover" > <thead><!-- table head--> <tr style="background-color: #BEC5C0;"> <th>Periode</th> <th>Matricule</th> <th>Employé</th> <th>BASE</th> <th>Primes</th> <th>BRUT</th> <th>CNSS</th> <th>SAL IMPO</th> <th>IRPP</th> <th>Avance/pret</th> <th>NET A PAYER</th> </tr> </thead> <tbody> <tr t-foreach="get_all_payslip_per_period(data['form']['date_start'],data['form']['date_end'])" t-as="p" > <td style="text-align:center;" t-esc="get_month_name(p.date_from)"></td> <td t-esc="p.employee_id.id"></td> <td t-esc="p.employee_id.name"></td> <t t-foreach="get_payslip_lines(p.line_ids)" t-as="l"> <t t-if="l.code=='BASE'"> <t t-set="base" t-value="l.total"/> <td t-esc="base"></td> </t> </t> <!-- primes --> <td> <div t-foreach="get_primes_values(p)" t-as="pr" > <div style="text-align:left;background-color: #BEC5C0;" t-esc="pr['code']"></div> <div style="text-align:right;background-color:#CDD8D0;" t-esc="pr['val']"></div> </div> </td> <t t-foreach="get_payslip_lines(p.line_ids)" t-as="l"> <t t-if="l.code=='BRUT' "> <t t-set="brut" t-value="l.total"/> <td t-esc="brut"></td> </t> <t t-if="l.code=='CNSS' "> <t t-set="cnss" t-value="l.total"/> <td t-esc="cnss"></td> </t> <t t-if="l.code=='NET' "> <t t-set="net" t-value="l.total"/> <td t-esc="net"></td> </t> <t t-if="l.code=='IRPP' "> <t t-set="irpp" t-value="l.total"/> <td t-esc="irpp"></td> </t> </t> <td t-esc="p.avance_amount"></td> <td t-esc="get_total_by_rule_category(p, 'AUTRE')-get_total_by_rule_category(p, 'RCC')-(p.avance_amount)"></td> </tr> </tbody> </table> </div> </div> </t> </t> </t> 上添加唯一性验证:

</data>

而且你必须先title validates :title, uniqueness: true 而不仅仅是create

product

这将创建一个build

的产品

对于具有相同context "two products with the same title" do Given{FactoryGirl.create(:product, title: "Hello test title")} Given(:post2){FactoryGirl.build(:product, title: "Hello test title")} Then{post2.invalid?} end 产品的第二个产品,将为title = "Hello test title"

答案 1 :(得分:0)

你应该使用像shoulda-matchers这样的宝石来测试这种测试:https://github.com/thoughtbot/shoulda-matchers 这会节省你很多时间,它会干你的测试(因为它们都是一样的)

关于你的测试,我不确定你想要实现什么。您没有验证那里的唯一性,只有产品的长度。要添加添加到产品型号的唯一性,请执行以下操作:

validates :title, uniqueness: true

在进行测试时,您应该创建(而不是构建)您的第一个产品。基本上,除非您的产品存储在数据库中,否则您的产品将是有效的,因为它不存在(还有)任何其他类似的产品。