尝试访问嵌套函数,"undefined is not a function"

Trying to access nested function, "undefined is not a function"

我正在使用 JavaScript(量角器)进行一些端到端测试。我有一个包含以下内容的 PageObjects 文件:

var SomeClass = function() {
    this.get = function() {
        browser.get('http://blah');
    };

    this.person = function() {
        var firstNameInput = element(by.id('firstName'));
        var lastNameInput = element(by.id('lastName'));

        this.setTitle = function(title) {
            element(by.xpath('//select[@id="title"]/option[text()="' + title +'"]')).click();
        };

        this.setFirstName = function(firstName) {
            firstNameInput.sendKeys(firstName);
        };

        this.setLastName = function(lastName) {
            lastNameInput.sendKeys(lastName);
        };
    };
};

module.exports = new SomeClass();

在我的规范中,我试图像这样访问嵌套函数:

describe('some test', function() {
    var someClass = require('./some_class.po.js');
    var data = require('./some_class.data.json');

    it('do stuff', function() {
        someClass.get();
        someClass.person.setTitle(data.title);
        someClass.person.setFirstName(data.firstName);
        someClass.person.setLastName(data.lastName);
    });
});

当我尝试 运行 这个测试时,更高级别 someClass.get() 工作正常,但是当它尝试执行 someClass.person.setTitle(data.title) 时,我收到一条 Failed: undefined is not a function 消息.

知道我做错了什么吗?我只使用 setter,没有 getter。不要认为我需要 return 任何东西。

您需要对代码进行一些更改才能访问 person()inner 函数。在 person() 末尾添加 return this,以便可以从 person().

外部访问 person() 的内部属性和方法

查看下面代码中突出显示的更改。

var SomeClass = function() {
  this.get = function() {
    browser.get('http://blah');
  };

  this.person = function() {
    var firstNameInput = element(by.id('firstName'));
    var lastNameInput = element(by.id('lastName'));

    this.setTitle = function(title) {
      element(by.xpath('//select[@id="title"]/option[text()="' + title + '"]')).click();
    };

    this.setFirstName = function(firstName) {
      firstNameInput.sendKeys(firstName);
    };

    this.setLastName = function(lastName) {
      lastNameInput.sendKeys(lastName);
    };

    return this;
    // ^^^^^^^^^
  };
};

module.exports = new SomeClass();

然后,您可以访问setTitle如下。

someClass.person().setTitle(data.title)
//              ^^ 

演示

var SomeClass = function() {
  this.person = function() {
    this.setTitle = function(title) {
      document.write(title);
    };

    return this;
    // ^^^^^^^^^
  };
};

var myObj = new SomeClass();
myObj.person().setTitle('Hello World!');