量角器功能测试不更新ng-model?

时间:2016-10-26 15:16:25

标签: angularjs phantomjs protractor angular-material jasmine2.0

所以在我的基本角度应用程序中,我有一个登录表单:

<form layout="column" class="form">
  <md-input-container>
    <label for="email" translate>login.email</label>
    <input id="email" type="email" ng-model="login.user.email" />
    <span ng-bind="login.user.email"></span>
  </md-input-container>
  <md-input-container>
    <label for="password" translate>login.password</label>
    <input id="password" type="password" ng-model="login.user.password" />
    <span ng-bind="login.user.password"></span>
  </md-input-container>
  <md-button class="hbd-primary"  ng-click="login.authenticate()" id="submit-button">
    <span translate>login.connection</span>
  </md-button>
</form>

我目前正在使用量角器和茉莉花进行功能测试。这是我的登录测试:

it('should fail login with bogus credentials', function() {
  page.emailInput.clear().then(function() {
    page.emailInput.sendKeys('supermerchant@bogus.com');
  });
  expect(page.emailInput.getAttribute('value')).toBe('supermerchant@bogus.com');
  page.passwordInput.clear().then(function() {
    return page.passwordInput.sendKeys('boguspass');
  })
  .then(function() {
    expect(page.passwordInput.getAttribute('value')).toBe('boguspass');
    return page.submitButton.click();
  })
  .then(function() {
    expect(page.alert.element(by.id("login-alert-text")).getText())
      .toBe('Email ou mot de passe invalide');
  });
});

我的问题是sendKeys()方法,即使它正确地写了电子邮件和密码(在视觉上它在输入中),当它触发登录功能时我发现了一些奇怪的请求参数:字段电子邮件和密码我的对象用户是空的,例如“”。但是当我检查输入'value'属性时,它被正确填充,例如“supermerchant@bogus.com”&amp; “boguspass”。

所以我搜索了很多但到目前为止一无所获,我不知道问题出在哪里......

任何线索都会非常感激!

编辑:来自控制器和服务的其他代码。

登录控制器

var vm = this;
vm.errors = '';
vm.user = {email: 'a', password: 'a', remember: true};
/**
*
* Log the user in.
*
**/
function authenticate() {
  vm.errors = '';
  retrieveToken(vm.user);
};

/**
*
* Get the jwt token. Change state depending on status.
*
**/
function retrieveToken(user) {
  authService.login(user)
    .success(function(data, status, headers, config) {
      saveToken(data.token);
      $state.go('employee');
    })
    .error(function(data, status, headers, config) {
      vm.errors = 'Email ou mot de passe invalide';
    });
};

/**
*
* Store the authenticated user.
*
**/
function saveToken(dataToken) {
  var token = jwtHelper.decodeToken(dataToken);
  var user = {
    id: token.id,
    firstName: token.firstName,
    lastName: token.lastName,
    roles: token.roles,
    token: dataToken
  };
  authService.setAuthentication(true, user);
};

authService

function auth($injector, constants) {
  var _authenticated = false;
  var _user = null;
  var service = {
    login: login,
    isAuthenticated: isAuth,
    setAuthentication: setAuth,
    getToken: getToken
  };

  /**
  *
  * Get the user authentication jwt.
  *
  **/
  function login(user) {
    return $injector.get('$http')
      .post(constants.baseApiUrl + 'authentication/login', user);
  };

  /**
  *
  * Return a boolean to check if user is connected to app.
  *
  **/
  function isAuth() {
    return _authenticated;
  };

  /**
  *
  * Set the current user authentication.
  *
  **/
  function setAuth(auth, user) {
    if (auth) {
      _authenticated = true;
      _user = user;
    }
    else if (auth === false) {
      _authenticated = false;
      _user = null;
    }
  };

EDIT2 :当我将字段电子邮件和密码设置为任何内容时,这些值在进行身份验证时不会更改,即使使用clear和sendKeys也是如此。但在视觉上,输入被清除并正确填充。所以我怀疑这个问题是一个数据绑定问题。也许双向绑定在某种程度上被打破了。

EDIT3 :好的,在每次输入的情况下,我添加了一个带有ng绑定到电子邮件和密码模型的范围。当使用sendKeys和clear时,跨度值不会改变(例如'a')。所以有一个数据绑定问题!从输入中手动删除字符时的值更改。

2 个答案:

答案 0 :(得分:0)

在我们的测试中,我们使用clear和sendKeys,但是在单独的调用中。

因此,对于您的情况,请尝试:

page.emailInput.clear();
page.emailInput.sendKeys('supermerchant@bogus.com');

另一种方法 - Protractor clear() not working

答案 1 :(得分:0)

因此,经过数小时和数小时后,我得到了解决方案。

启动功能测试时,我使用浏览器同步并打开另一个浏览器来检查一切是否正常。

有点,在使用浏览器同步选项open: false并让phantomjs做它的神奇之后,一切正常。不确定为什么这是一个问题,但它现在已经解决了!