2013-12-12 26 views
0

我使用一个库proxyquire,它包装Node的require方法以允许模拟对象注入。的特点之一是,它扩展了原来那么缺少的属性填充在模拟对象可以通过模拟对象上设置属性关闭这个功能称为@noCallThru像这样:如何在CoffeeScript中分配需要引用的静态类属性?

MockObj = 
    stubFunc: -> 
    "@noCallThru": true 

proxyquire "path/to/module", 
    "path/to/mocked_module": MockObj 

有些模块是构造函数(类),以便嘲笑他们使用CoffeeScript的类系统。然而,在返回的对象(在这种情况下是类)上检查使用@noCallThru,并且因为它不是一个实例将不使用原型。 @noCallThru需要是该类的静态属性。

如何定义需要引用的CoffeeScript类的静态属性?我能找到的最好的办法就是像这样注入strait JavaScript:

class MockClass 
    stubFunc: -> 
    `MockClass['@noCallThru'] = true` 

有没有更好的方法?

回答

3

您不需要将其注入为JavaScript。你可以这样做:

class MockClass 
    stubFunc: -> 
    @['@noCallThru'] = true 

(因为在类定义,this@指类/构造函数本身)

上面的代码编译为:

var MockClass; 

MockClass = (function() { 
    MockClass.name = 'MockClass'; 
    function MockClass() {} 
    MockClass.prototype.stubFunc = function() {}; 
    MockClass['@noCallThru'] = true; 
    return MockClass; 
})(); 
+0

完美!谢谢! – Sukima

+0

'@ ['@ noCallThru'] = true'会更接近通常的'@class_prop = x'。 –

+0

@ muistooshort:谢谢,把它移到答案的第一部分。 –

相关问题