2017-04-22 3 views
1

Je dois tester le type d'argument passé est un nombre entier. Voici mon spec test:RSpec comment tester un type de données d'argument passé à une méthode

require 'ball_spin' 

RSpec.describe BallSpin do 
    describe '#create_ball_spin' do 
    subject(:ball_spin) { BallSpin.new } 
    it 'should accept an integer argument' do 
     expect(ball_spin).to receive(:create_ball_spin).with(an_instance_of(Integer)) 
     ball_spin.create_ball_spin(5) 
    end 
    end 
end 

Mon code:

class BallSpin 
    def create_ball_spin n 
    "Created a ball spin #{n} times" if n.is_a? Integer 
    end 
end 

Merci à l'avance

MISE À JOUR:

Apologize pour l'utilisation de l'ancienne syntaxe RSpec, ci-dessous, je mis à jour mon code pour utiliser la dernière:

it 'should accept an integer argument' do 
    expect(ball_spin).to receive(:create_ball_spin).with(an_instance_of(Integer)) 
    ball_spin.create_ball_spin(5) 
end 

Répondre

1

Vous pouvez ajouter un bloc à receive pour vérifier la méthode params:

expect(ball_spin).to receive(:create_ball_spin) do |arg| 
    expect(arg.size).to be_a Integer 
end 

Vous trouverez les détails dans Arbitrary Handling section de la documentation rspec-mocks.

MISE À JOUR: Aussi, vous pouvez utiliser la même approche avec should syntaxe:

ball_spin.should_receive(:create_ball_spin) do |arg| 
    arg.should be_a Integer 
end 
+0

Salut, merci pour répondre, je suis une erreur NoMethodError: méthode non définie recevoir » pour #

+1

@Kris MP, quelle version de Rspec vous utilisez? –

0

L'utilisation du cas receive matcher est aux spécifications qu'une méthode est appelée par quelqu'un. Mais il est à noter que le matcher lui-même n'appelle pas cette méthode ni qu'il teste si la méthode existe ou si la liste des arguments possibles correspond à un modèle donné.

Il semble que votre code n'appelle pas du tout cette méthode. Un test simple qui devrait passer pourrait ressembler à ceci:

subject(:ball_spin) { BallSpin.new } 

it 'is called with an integer argument' do 
    ball_spin.should_receive(:create_ball_spin).with(an_instance_of(Integer)) 
    ball_spin.create_ball_spin(5) # method called 
end 

it 'is not called' do 
    ball_spin.should_not_receive(:create_ball_spin) 
    # method not called 
end 

Voir la section Argument Matcher. Si vous utilisez l'ancienne syntaxe RSpec, vous pouvez envisager de mettre à jour votre suite de tests avec la nouvelle syntaxe expect.

+0

déjà essayé celui-ci mais toujours pas de chance –

+0

@KrisMP J'ai mis à jour ma réponse. Parce qu'il me semble que vous vous attendez à ce que le matcher fonctionne d'une certaine façon, il n'a pas été conçu pour fonctionner. – spickermann

+0

J'ai mis à jour ma question et je m'adapte à la nouvelle syntaxe RSpec –

1

Je pense que la raison est que 5 est une instance de Fixnum et non entier:

2.2.1 :005 > 5.instance_of?(Fixnum) 
    => true 
2.2.1 :006 > 5.instance_of?(Integer) 
    => false 

MISE À JOUR: Ok, je l'ai essayé votre code et le problème est entier au lieu de Fixnum. Voici l'affirmation correcte:

RSpec.describe BallSpin do 
    describe '#create_ball_spin' do 
    subject(:ball_spin) { BallSpin.new } 
    it 'should accept an integer argument' do 
     expect(ball_spin).to receive(:create_ball_spin).with(an_instance_of(Fixnum)) 
     ball_spin.create_ball_spin(5) 
    end 
    end 
end