Pourquoi est-ce sinon espion de ne pas être appelé lorsque j'exécute ce test?
J'ai une épine Dorsale Modèle:
class DateTimeSelector extends Backbone.Model
initialize: ->
@bind 'change:date', @updateDatetime
@bind 'change:time', @updateDatetime
updateDatetime: =>
# do some stuff with the sate and time
Et j'ai quelques tests pour que le code à l'aide jasmin et sinon.js
describe "DateTimeSelector", ->
beforeEach ->
@datetime = new DateTimeSelector()
describe "updateDatetime", ->
beforeEach ->
@updateSpy = sinon.spy(@datetime, 'updateDatetime')
afterEach ->
@datetime.updateDatetime.restore()
# passes
it "should be called when we call it", ->
@datetime.updateDatetime()
expect(@updateSpy).toHaveBeenCalledOnce()
# fails
it "should be called when we trigger it", ->
@datetime.trigger 'change:date'
expect(@updateSpy).toHaveBeenCalled()
# fails
it "should be called when we set the date", ->
@datetime.set { date: new Date() }
expect(@updateSpy).toHaveBeenCalled()
Il semble que cela fonctionne lorsque je l'utilise dans le navigateur, mais je n'arrive pas à faire passer les tests. Quelqu'un peut-il m'éclairer?
- Vous pouvez modifier le balisage d'inclure
coffeescript
. J'aurais ajouté pour vous, mais vous êtes au maximum à 5 et je ne voulais pas prendre la décision de les remplacer pour vous. - Ouais, je ne sais jamais quoi faire dans cette situation. La question qui est écrit dans le Café, bien sûr, mais le problème et la solution sont (probablement) pas coffeescript liés. Donc je ne sais pas si c'est correct de balise comme coffeescript.
- J'ai bien regardé à cette question, car il a été marqué JS, mais je suis incapable de l'aider parce que l'exemple est coffeescript je n'utilise pas moi-même. Alors j'ai pensé à un coffeescript balise peut attirer d'autres coffeescript utilisateurs, qui pourraient plus facilement lire et comprendre votre exemple. 🙂
- Il semble que vous tester quelque chose de mal ici. Dans la plupart des cas, il n'est pas une bonne idée d'espionner la classe que vous souhaitez tester. Dans votre cas, il faut tester si le résultat de
@updateDatetime
est celui que vous attendiez, pas si ça s'appelle, parce que c'est la fonctionnalité que vous obtenez à partir de la dorsale et vous devez avoir confiance en eux qu'ils se tester leurs trucs.
Vous devez vous connecter pour publier un commentaire.
duckyfuzz, vous rencontrez ce problème, car lors de la création de l'espion (qui, en fait, enveloppements à la fonction d'origine et crée un niveau d'indirection pour insérer ses services de suivi de l'invocation de méthode) la liaison de l'événements ont déjà eu lieu. Ce qui signifie que même si l'espion enveloppé la fonction d'origine de la liaison des événements les références de la fonction d'origine et non enveloppés d'espionnage. Par conséquent, quand vous test, la fonction d'origine est exécuté sur l'événement déclencheur, mais l'espion de suivi est un niveau au-dessus et n'est pas exécutée.
Pour s'assurer que l'événement de liaison est en fait pointant vers le enveloppés spy fonction, vous devez créer l'espion avant de créer le modèle de l'objet (en va de même si l'on analyse des points de vue). Pour ce faire, créez l'espion sur le prototype."méthode" de la classe:
dans le beforeEach -> section avant @datetime = new DateTimeSelector() créer l'espion: @updateSpy = sinon.espion(DateTimeSelector.prototype, 'updateDatetime')
assurez-vous de changer votre afterEach -> section où vous retournez le prototype de retour à la normale, comme suit: @updateSpy.restore()
ce doit être votre code:
BTW, si vous utilisez jasmin-sinon.js plugin alors votre syntaxe est très bien
Vous avez mélangé les moqueries de la syntaxe, de jasmin et sinon ensemble.
Dans votre passer des tests de votre sinon espion expose la propriété
calledOnce
mais vous êtes à l'aide d'un jasmin-esque fonctiontoHaveBeenCalledOnce()
. Cette fonction n'existe pas sur l'sinon espion donc, essentiellement, pas d'affirmer, c'est de prendre place.Dans votre défaut de tests que vous appelez le jasmin spy fonction
toHaveBeenCalled()
sur votre sinon espion. Jasmin a sa propre syntaxe pour la création d'un espion:spyOn(obj, 'method');