【问题标题】:Coffeescript: Unable to instantiate object of a class in different fileCoffeescript:无法在不同文件中实例化类的对象
【发布时间】:2017-02-28 19:26:36
【问题描述】:

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

输入.咖啡

   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")

初始化.coffee

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

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

【问题讨论】:

标签: javascript angularjs coffeescript protractor ui-testing


【解决方案1】:

这里的问题是导致所需的 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,因此您可以手动处理导出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2013-02-15
    • 1970-01-01
    • 2015-04-02
    • 2020-11-24
    • 2011-11-15
    相关资源
    最近更新 更多