0

ここで何が間違っていますか?次のようなコードがあります。

function getUserList(requestingUserId){
  return customerRepo.getCustomersAllowedByUser(requestingUserId)
  .then(function(customers){
    return userRepo.getUserList({customers: customers});
  });
}

私のリポジトリコードは次のようにスタブ化されています:

customerDeferred = q.defer();
userDeferred = q.defer();

customerRepository.getCustomersAllowedByUser = sinon.stub().returns(customerDeferred.promise);
userRepository.getUsers = sinon.stub().returns(userDeferred.promise);

両方の約束が解決され、顧客の約束を拒否すると期待どおりにすべて正常に機能しますが、顧客の約束を解決してユーザーの約束を拒否すると、テストが失敗します。テストは次のとおりです。

it('should forward the rejection when userRepository rejects the promise', function(done){
  var rejectionError = new Error("test");
  var receivedError;

  userServices.getUserList(1)
  .then(null, function(error){
    receivedError = error;
  })
  .fin(function(){
    receivedError.should.equal(rejectionError);
    done();
  });

  customerDeferred.resolve(customerList);
  userDeferred.reject(rejectionError);
});
4

1 に答える 1

1

何が問題なのかを確認するには、テストを一時的に次のものに置き換えます。

var rejectionError = new Error("test");
var receivedError;

userServices.getUserList(1).done();

customerDeferred.resolve(customerList);
userDeferred.reject(rejectionError);

これにより、実際のエラーが出力されます。タイプミスに起因するすべてのエラーを修正すると、それが機能することがわかります。

問題は、userRepoが と異なり、userRepositorygetUsersは異なることgetUserListです。

これらすべてを修正すると、次のようになりました。

var q = require('q')
var sinon = require('sinon')

var assert = require('assert')

customerDeferred = q.defer();
userDeferred = q.defer();

var customerList = []
var customerRepo = {}
var userRepo = {}

customerRepo.getCustomersAllowedByUser = sinon.stub().returns(customerDeferred.promise);
userRepo.getUsers = sinon.stub().returns(userDeferred.promise);

function getUserList(requestingUserId){
  return customerRepo.getCustomersAllowedByUser(requestingUserId)
  .then(function(customers){
    return userRepo.getUsers({customers: customers});
  });
}

var rejectionError = new Error("test");
var receivedError;

getUserList(1)
.then(null, function(error){
  receivedError = error;
})
.fin(function(){
  assert.equal(receivedError, rejectionError);
  console.log('DONE')
});

customerDeferred.resolve(customerList);
userDeferred.reject(rejectionError);

これは完全に実行されます。

于 2013-05-17T13:44:35.217 に答える