无法在不同文件中实例化一个类的对象

Coffeescript: Unable to instantiate object of a class in different file

本文关键字:一个 对象 实例化 文件      更新时间:2023-09-26

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

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   

错误:Cannot read property of undefined.

这里的问题是由于所需的CoffeeScript文件没有被翻译成JavaScript。如果你在你的HTML页面中包含CoffeeScript编译器,它只会自动在开始编译<script type="text/coffeescript">元素。

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

虽然有一个实用程序可以将各种CoffeeScript文件连接成一个文件,这里https://github.com/fairfieldt/coffeescript-concat(在这篇文章中引用,这就是为什么这是一个重复的问题),所以你可以很容易地将单个文件编译成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,所以你可以手动处理导出