2010-10-21 5 views

Répondre

5

Normalement, je répondrais à la question avec le cavet que c'est une mauvaise idée, mais c'est une si mauvaise idée que je vais seulement répondre à la moitié, comment se moquer de générique de concombre.

Vous voyez que le concombre est censé être un test total de l'extérieur, il est donc destiné à exécuter complètement votre code sans aucun double de test. L'essentiel est que vous n'êtes pas un test unitaire mais que vous testez votre application entière.

« We recommend you exercise your whole stack when using Cucumber. [However] you can set up mocks with expectations in your Step Definitions. » - Aslak Hellesøy, Créateur de concombre

Attribuées vous peut faire cela, mais vous allez avoir besoin d'écrire vos propres classes tcpserver et TCPSocket pour éviter d'utiliser le réseau et qui peut effectivement présenter bugs depuis que vous écrivez des spécifications contre vos fausses classes Net pas les classes Net réelles. Encore une fois, pas une bonne idée.

Assez de jappements, voici comment utiliser des mock dans Concombre. (Je vais supposer que vous avez une compréhension de base de concombre et Ruby, donc je vais sauter quelques étapes comme la façon d'exiger vos fichiers de classe dans le concombre.)

Disons que vous avez les classes suivantes:

class Bar 
    def expensive_method 
    "expensive method called" 
    end 
end 

class Foo 

    # Note that if we don't send a bar it will default to the standard Bar class 
    # This is a standard pattern to allow test injection into your code. 
    def initialize(bar=Bar.new) 
    @bar = bar 
    puts "Foo.bar: #{@bar.inspect}" 
    end 

    def do_something 
    puts "Foo is doing something to bar" 
    @bar.expensive_method 
    end 

end 

vous devriez avoir le bar et les classes Foo requises dans votre dossier features/support/env.rb mais pour permettre RSpec se moque de vous besoin d'ajouter la ligne suivante:

require 'cucumber/rspec/doubles' 

créez maintenant un fichier de fonctionnalités comme celui-ci:

Feature: Do something 
    In order to get some value 
    As a stake holder 
    I want something done 

Scenario: Do something 
    Given I am using Foo 
    When I do something 
    Then I should have an outcome 

et ajoutez les étapes à votre étape fichier de définitions:

Given /^I am using Foo$/ do 
    # create a mock bar to avoid the expensive call 
    bar = double('bar') 
    bar.stub(:expensive_method).and_return('inexpensive mock method called') 
    @foo = Foo.new(bar) 
end 

When /^I do something$/ do 
    @outcome = @foo.do_something 
    # Debug display of the outcome 
    puts "" 
    puts "*" * 40 
    puts "\nMocked object call:" 
    puts @outcome 
    puts "" 
    puts "*" * 40 
end 

Then /^I should have an outcome$/ do 
    @outcome.should_not == nil 
end 

Maintenant lorsque vous exécutez votre fichier fonctionnalité vous devriez voir:

**************************************** 

Mocked object call: 
inexpensive mock method called 

****************************************