Question

Ceci est quelque chose qui a été me rend fou au cours des derniers jours. J'ai une action qui permet aux utilisateurs authentifiés de télécharger des actifs sur le site. Je sais que l'action du contrôleur est correct que je peux courir à travers le processus manuellement mais je veux le tester en utilisant rspec.

Je dois utiliser l'aide de request afin que je puisse réutiliser une session authentifiée qui est un :given pour cette série de tests.

it "should allow authenticated file uploads" do
    file = File.open(a_valid_file)
    mock_file = mock("file")
    mock_file.stub!(:path).and_return(file.path)

    request( resource(:assets), :method => "POST",
        :params => { :file => 
            {:tempfile => mock_file, :filename => File.basename(file.path)} }
    )
end

Si je l'intérieur du point d'arrêt spec tout fonctionne bien, mais quand je lance la spécification et essayer d'accéder au chemin de l'action du contrôleur par le débogueur je reçois ceci:

e file[:tempfile].path
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String

Je suppose que le stub!(:path) n'est pas réglé pour tout objet fantaisie est en fait par la demande.

La question est: ce que je vais sur le droit chemin pour le téléchargement de fichiers de test et si pas ce qui est une autre façon

?
Était-ce utile?

La solution

Je faisais mal. En utilisant request il appelait to_s sur tous paramaters, donc mon objet fantaisie était passé comme "# [Spec :: Mocks :: Mock: 0x3fda2a4736c0 @name = \" fichier \ "]". Cela me apprendra à accorder plus d'attention à la sortie d'exception.

Au lieu de cela je devrais utiliser multipart_post et bouchonner les appels d'authentification dans un bloc.

it "should allow authenticated file uploads" do
    file = File.open(a_valid_file)

    multipart_post( resource(:assets), :method => "POST", 
            :params => { :file => file } ) do |controller|
        controller.stub!(:ensure_authenticated).and_return(true)
        controller.session.stub!(:user).and_return(User.first)

    )
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top