2016-07-16 23 views
2

我正在使用角,chai,角模,摩卡,业力。测试输出这样的错误:如何让这个测试通过摩卡?

Type error

[email protected][native code]

app/main.coffee:30:23 <- app/main.js:23:23

test/main.spec.coffee:59:20 <- test/main.spec.js:18:27

assert = chai.assert 
expect = chai.expect 

describe("The Address Book App",() -> 
    describe("the proper filter",() -> 
    proper = null 
    beforeEach(() -> 
     module("AddressBook") 
     inject(($injector)-> 
     proper = $injector.get("$filter")("proper") 
    ) 
    ) 

    it("should proper case a string",() -> 
     expect(proper("ned stark")).to.equal("Ned Stark") 
    ) 
) 
) 

main.coffee

class AddressBook 
    constructor: -> 
    return [] 

class Proper 
    uppercase: (word) -> 
    word[0].toUpperCase().concat(word.slice(1)) 

    constructor:() -> 
    return (name) -> 
     words = name.toString().split(" ") 
     return words.map(@uppercase).join(" ") 


angular.module('AddressBook', new AddressBook()) 
.filter('proper', [Proper]) 

更新

我觉得一个类的方法 '大写' 更适合这种情况下,用“main.coffee”中的一点变化就是测试通过。

class AddressBook 
    constructor: -> 
    return [] 

class Proper 
    @uppercase: (word) -> 
    word[0].toUpperCase().concat(word.slice(1)) 

    constructor:() -> 
    return (name) -> 
     words = name.toString().split(" ") 
     return words.map(Proper.uppercase).join(" ") 


angular.module('AddressBook', new AddressBook()) 
.filter('proper', [Proper]) 

但是,如果我真的需要和实例方法,如何使通过测试?

回答

0

这是因为CoffeeScript处理this关键字的方式。在你的构造函数中,你正在返回一个函数,但是在这个函数中访问变量@uppercase。在这种情况下,您希望this关键字(即@)引用正在构建的对象实例。但是,this始终引用调用该函数的对象,这种情况是undefined

为了解决这个问题,简单地使用脂肪箭头,CoffeeScript的将设置this关键字预期:

class Proper 
    uppercase: (word) -> 
    word[0].toUpperCase().concat(word.slice(1)) 

    constructor:() -> 
    return (name) => 
     words = name.toString().split(" ") 
     return words.map(@uppercase).join(" ") 
+0

这没有工作,输出相同的错误 – wilcus