1

したがって、私の基本的なAngularアプリには、ログインフォームがあります:

<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() メソッドにあり、電子メールとパスワードを正しく書き込んでいても (視覚的には入力にある)、ログイン機能をトリガーすると、リクエストパラメーターで奇妙なことに気付きました: 私のオブジェクトのフィールド email と password user は空です (例: "")。しかし、入力の「値」属性を確認すると、「supermerchant@bogus.com」と「boguspass」のように正しく入力されています。

だから私はたくさん検索しましたが、これまでのところ何も見つかりませんでした。問題がどこにあるのかわかりません...

どんなリードでも大歓迎です!

EDIT : コントローラーとサービスからの追加コード。

ログインコントローラー

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);
};

認証サービス

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 : フィールド email と password を何かに設定すると、 clear と sendKeys を使用しても、認証時にこれらの値は変更されません。しかし視覚的には、入力はクリアされ、正しく入力されています。したがって、問題はデータバインディングの問題であると思われます。双方向バインディングが何らかの形で壊れている可能性があります。

EDIT3:OKなので、すべての入力の下に、電子メールとパスワードモデルへのngバインディングを使用してスパンを追加しました。sendKeys と clear を使用すると、spans の値は変更されません (たとえば、'a')。したがって、データバインディングの問題があります! 入力から文字を手動で削除すると、値が変化します。

4

2 に答える 2

0

それで、何時間も何時間も経って、私は解決策を得ました。

機能テストを開始するとき、私はブラウザー同期を使用していましたが、別のブラウザーを開いてすべてが問題ないかどうかを確認しました。

ブラウザの同期オプションを使用しopen: false、phantomjs に魔法のように実行させた後、多少、すべてが機能します。なぜそれが問題だったのかはわかりませんが、現在は解決されています!

于 2016-11-02T10:37:05.540 に答える
0

私たちのテストでは、clear と sendKeys を使用していますが、別の呼び出しで使用しています。

したがって、あなたの場合、試してください:

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

別のアプローチ -分度器 clear() が機能しない

于 2016-10-26T15:54:37.203 に答える