2015-10-20 1 views
1

Je suis nouveau sur coffeescript et j'essaie de créer une bibliothèque pour ajouter du sucre syntaxique à la fois pour cofffeescript et javascript. Il utilise beaucoup de décorateurs, donc je suis surpris que ce test échoue:Pourquoi shouldjs dit que les deux objets ne sont pas les mêmes?

it 'sandbox',() -> 

    id = (x) -> x 
    fn = (y) -> y == 1 
    f = id fn 
    should(f).be.equal(fn) 
    should(f 3).be.false() 

Ce que je pense que je fais:

  • créer la fonction id qui retourne son premier argument.
  • créer la fonction fn qui renvoie true ssi son premier argument est 1
  • appliquent id sur fn. Je m'attends à ce que le résultat f soit exactement le même (référence sage!) Que fn.

should.js dit que mon résultat f est même pas une fonction:

1) Function guard predicate #bakeFunctionPredicate sandbox: 
    TypeError: object is not a function 
    at Context.<anonymous> (/Users/luftzug/private/jspatterns/test/patterns.test.coffee:31:7) 
    at Test.Runnable.run (/Users/luftzug/private/jspatterns/node_modules/grunt-mocha-cli/node_modules/mocha/lib/runnable.js:221:32) 
    at Runner.runTest (/Users/luftzug/private/jspatterns/node_modules/grunt-mocha-cli/node_modules/mocha/lib/runner.js:378:10) 
    at /Users/luftzug/private/jspatterns/node_modules/grunt-mocha-cli/node_modules/mocha/lib/runner.js:456:12 
    at next (/Users/luftzug/private/jspatterns/node_modules/grunt-mocha-cli/node_modules/mocha/lib/runner.js:303:14) 
    at /Users/luftzug/private/jspatterns/node_modules/grunt-mocha-cli/node_modules/mocha/lib/runner.js:313:7 
    at next (/Users/luftzug/private/jspatterns/node_modules/grunt-mocha-cli/node_modules/mocha/lib/runner.js:251:23) 
    at Immediate._onImmediate (/Users/luftzug/private/jspatterns/node_modules/grunt-mocha-cli/node_modules/mocha/lib/runner.js:280:5) 
    at processImmediate [as _immediateCallback] (timers.js:367:17) 

Je suis très confus. Est-ce shouldjs qui fait quelque chose d'inattendu, ou coffeescript n'est pas traduit dans le code que je m'attends à traduire?

+0

Êtes-vous sûr que le problème est avec 'f'? La documentation de [should.js] (https://github.com/shouldjs/should.js/wiki/Breaking-changes) note que 'be.false' a été changé en' be.false() 'dans la version 7. Peut-être que vous utilisez-vous toujours une version plus ancienne? – andersschuller

+0

@andersschuller Il échoue sur la ligne avant cela, donc non, ce n'est pas le problème (mais pourrait être un problème, qui sait). – Luftzig

Répondre

0

Erreur dans la pile n'est pas AssertionError et cela signifie que le problème n'est pas dans should.js lui-même. J'ai converti le code du café en js et ça a l'air correct. Je pense que vous n'avez pas should fonction dans votre test: var should = require('should')

+0

c'est intéressant. J'ai un 'should = require 'should'' qui est l'équivalent café de votre code ailleurs dans le fichier, et j'ai d'autres tests qui passent et vérifient des comparaisons simples avec should.js. Je vais voir si je pourrais l'observer un peu comment. – Luftzig

0

J'ai regardé ceci et n'a pas pu reproduire le problème.

Questions:

  • Quel énoncé est à la ligne 31? (Les numéros de ligne et console.log peuvent clarifier ce qui se passe ici).
  • Pourquoi le TypeError (il tente d'invoquer objet en fonction)
  • Qu'est-ce que le fichier compile à (ce que le javascript montrent que le problème plus clairement)

Il doit y avoir quelque chose à l'extérieur ce que vous avez montré (ancienne version du paquet?, configuration de grunt-mocha-cli ?, ???)

Voici ce que j'ai fait pour valider. REMARQUE: tous les packages npm sont des installations récentes.

J'ai commencé avec votre fonctionnalité de base et prouvé 'Ce que je pense que je fais' vrai.

id = (x) -> x 
fn = (y) -> y == 1 
console.log "typeof fn: #{typeof fn}" # function 
f = id fn 
console.log "typeof f: #{typeof f}" # function 
console.log "fn is f: #{fn is f}"  # true 
console.log "fn == f: #{fn == f}"  # true 
# CoffeeScript thinks they are equal 

Je testé que les affirmations 'devraient' passé

should(f).be.equal(fn) 
should(f 3).be.false() 
# No assertions here 

ensuite essayé de recréer votre test

describe 'function comparison', -> 
    it 'should provide identity for functions', -> 
    id = (x) -> x 
    fn = (y) -> y == 1 
    f = id fn 
    should(f).be.equal(fn) 
    should(f 3).be.false() 

En utilisant cette Gruntfile.café

module.exports = (grunt) -> 

    require('load-grunt-tasks')(grunt) 

    grunt.initConfig 
    pkg: grunt.file.readJSON 'package.json' 

    mochacli: 
     options: 
     require: ['should', 'coffee-script/register'] 
     reporter: 'spec' 
     compilers: ['coffee:coffee-script'] 
     all: ['coffeescript/functionComparison.coffee'] 

    # run test for functionComparison.coffee 
    grunt.registerTask 'default', ['mochacli'] 

qui donne

Running "mochacli:all" (mochacli) task 

    function comparison 
    ✓ should provide identity for functions 

    1 passing (3ms) 

Done, without errors.