2014-04-03 11 views
5

Utilizzo di RSpec, come si scrive un gruppo di esempi_condivisi che è DRY e può essere utilizzato per i casi positivi e negativi?Rspec: ESEMPI di esempi condivisi per casi positivi e negativi

Esempio di shared_examples che funziona per i casi positivi:

shared_examples "group1" do 
    it "can view a person's private info" do 
    @ability.should be_able_to(:view_private_info, person) 
    end 
    # also imagine I have many other examples of positive cases here 
end 

Se c'è qualcosa di contrario di it_should_behave_like, come it_should_not_behave_like, sarebbe fantastico. Capisco che il testo dell'esempio dovrà essere flessibile.

+0

Mi sono chiesto questo per mesi. Non penso che si possa fare, ma forse è il meglio. Le specifiche potrebbero essere molto difficili da seguire. – Starkers

risposta

0

Si potrebbe fare così:

Classi in prova:

class Hat 
    def goes_on_your_head? 
    true 
    end 

    def is_good_to_eat? 
    false 
    end 

end 

class CreamPie 
    def goes_on_your_head? 
    false 
    end 

    def is_good_to_eat? 
    true 
    end 

end 

Esempi:

shared_examples "a hat or cream pie" do 
    it "#{is_more_like_a_hat? ? "goes" : "doesn't go" } on your head" do 
    expect(described_class.new.goes_on_your_head?).to eq(is_more_like_a_hat?) 
    end 

    it "#{is_more_like_a_hat? ? "isn't" : "is" } good to eat" do 
    expect(described_class.new.is_good_to_eat?).to eq(!is_more_like_a_hat?) 
    end 

end 

describe Hat do 
    it_behaves_like "a hat or cream pie" do 
    let(:is_more_like_a_hat?) { true } 
    end 
end 

describe CreamPie do 
    it_behaves_like "a hat or cream pie" do 
    let(:is_more_like_a_hat?) { false } 
    end 
end 

mi sarebbe meno probabilità di fare questo nel codice vero e proprio, dal momento che sarebbe essere difficile da scrivere descrizioni di esempi comprensibili. Invece, mi piacerebbe fare due esempi condivise ed estrarre la duplicazione in metodi:

def should_go_on_your_head(should_or_shouldnt) 
    expect(described_class.new.goes_on_your_head?).to eq(should_or_shouldnt) 
end 

def should_be_good_to_eat(should_or_shouldnt) 
    expect(described_class.new.is_good_to_eat?).to eq(should_or_shouldnt) 
end 

shared_examples "a hat" do 
    it "goes on your head" do 
    should_go_on_your_head true 
    end 

    it "isn't good to eat" do 
    should_be_good_to_eat false 
    end 

end 

shared_examples "a cream pie" do 
    it "doesn't go on your head" do 
    should_go_on_your_head false 
    end 

    it "is good to eat" do 
    should_be_good_to_eat true 
    end 

end 

describe Hat do 
    it_behaves_like "a hat" 
end 

describe CreamPie do 
    it_behaves_like "a cream pie" 
end 

Naturalmente non sarebbe estrarre quei metodi o anche utilizzare esempi comuni a tutti a meno che gli esempi concreti sono state complicate sufficiente a giustificarlo.