Coffeescript:无法在不同的文件中实例化类的对象

时间:2016-10-19 08:55:47

标签: javascript angularjs coffeescript protractor ui-testing

我无法在测试中使用量角器代码中的其他文件中实例化(或调用他们的方法)类。 这是我的文件

Input.coffee

   class exports.Input

      @element = null

        constructor: (@type, @selector, @identifier) ->
        if @selector is "id"
          @element = element(By.id(@identifier))
        if @selector is "class"
          @element = element(By.css(@identifier))
        console.log @element

      click: ->
        @element.click()

      putText: (inputText) ->
        @element.sendKeys(inputText)  

test.coffee

describe 'Testing protractor modules', ->
  it 'Testing demo and experimentations', ->
# Initialize all the DOM elements which the suite covers 
    initialize = require('..\\utils\\initialize.coffee').Initialize("https://url.com")    

    inputText = require('..\\utils\\input.coffee').Input("text", "id", "user_email")
    inputPassword = require('..\\utils\\input.coffee').Input("text", "id", "user_password")

    console.log inputText # This is printing undefined
    inputText.putText("analytics@grs.com")
    inputPassword.putText("analytics123")

initialize.coffee

class exports.Initialize
  constructor: (@url) ->
    browser.ignoreSynchronization = true
    browser.get @url
    console.log "Initialize constructor" # This works   

错误:无法读取未定义的属性。

1 个答案:

答案 0 :(得分:0)

这里的问题是因为所需的CoffeeScript文件没有转换为JavaScript。如果在HTML页面中包含CoffeeScript编译器,它只会在开始时自动编译<script type="text/coffeescript">个元素。

我基本上停止使用require来包含CoffeeScript文件。

虽然有一个实用工具可以将各种CoffeeScript文件连接成一个,但这里https://github.com/fairfieldt/coffeescript-concat(在post引用,这就是为什么这是一个重复的问题),所以你可以很容易将单个文件编译为JavaScript。

如果您仍然需要类似require的内容来加载CoffeeScript文件,您需要为此类文件发出异步或同步HTTP请求,获取内容,然后将其转换为JS代码。

不推荐使用同步HTTP请求,因此您无法为require创建类似的内容,您需要稍后执行的回调函数...或者在请求之后已经太晚了已完成并在编写CoffeeScript之后。

您还需要使用Functioneval评估已编译的CoffeeScript。 eval执行已调用的当前作用域中的代码,而Function在全局作用域中执行。

使用异步HTTP请求和eval评估已编译的CoffeeScript的示例(首先包括CoffeeScript编译器):

(注意:这个例子并没有避免脚本缓存,这有点宽泛)

function getCoffee(filePath, callback) {
    var request = new XMLHttpRequest;
    request.open('get', filePath, true);

    request.onreadystatechange = function() {
        if (request.readyState === 4) {

            if (request.status === 200) {
                var compiled = CoffeeScript.compile(request.responseText);

                if (typeof callback === 'function') {
                    callback(compiled);
                }
            }
            else {
                /* Handle request error here */
            }
        }
    };

    request.send();
}
getCoffee "script.coffee",
          (compiled) ->
            eval compiled;

注意:我不知道require的工作方式,因为我不了解Angular.js,因此您可以手动处理导出。