2016-05-01 9 views
0

プッシュ通知を送信する関数をテストしたいと思います。私は通知の送信をスタブしたいと思います。私はモカとサイロンを使用します。私はいくつかの構文でスタブしようとしましたが、うまくいきません。一つのスタブは、私が試した:sinonを使ったプッシュ通知のスチューブ

var gcm = require('node-gcm'); 

// Function to test 
NotificationService.prototype.sendSpecificNotification = function (data) { 
    var self = this; 
    // Process data to create the users, title and text parameters 
    return self.send(users, title, text) 
     .then(function(pushResults) { 
      // expect ... 
     }) 
}; 

NotificationService.prototype.send = function (users, title, text) { 
    var registrationIds = []; 
    users.forEach(function (user) { 
     var push = user.preferences != null ? user.preferences.push : false; 
     if (push) { 
      var regId = user.preferences.pushRegId; 
      registrationIds.push(regId); 
     } 
    }); 
    var deferred = Q.defer(); 
    if (registrationIds.length > 0) { 
     var message = new gcm.Message(); 
     message.addData('message', text); 
     message.addData('title', title); 
     message.delayWhileIdle = false; 
     message.timeToLive = 24 * 60 * 60; 
     var currentDate = new Date(); 
     var notId = currentDate.getHours() * 60 * 60 + currentDate.getMinutes() * 60 + currentDate.getSeconds(); 
     message.addData('notId', notId); 
     var sender = new gcm.Sender(config.gcm.senderId); 
     // I want to stub that call 
     sender.send(message, registrationIds, function (err, result) { 
      if (err) { 
       deferred.reject(new Error(error)); 
      } else { 
       deferred.resolve(result); 
      } 
     }); 
    } else { 
     deferred.resolve(''); 
    } 
    return deferred.promise; 
} 

EDIT

var sender = sinon.createStubInstance(gcm.Sender); 
var gcmReturn = { 
    multicast_id: 1, 
    success: 1, 
    failure: 1, 
    canonical_ids: 1, 
    results: [{ 
     registration_id: 'xxxx', 
     message_id: 'yyy' 
    }, { 
     error: 'InvalidRegistration' 
    }] 
} 
sender.send = function() { 
    return gcmReturn; 
} 

コードのテストにテスト

it('Subscription Push', function() { 
    var sender = sinon.createStubInstance(gcm.Sender); 
    var gcmReturn = { 
     multicast_id: 1, 
     success: 1, 
     failure: 1, 
     canonical_ids: 1, 
     results: [{ 
      registration_id: 'xxxx', 
      message_id: 'yyy' 
     }, { 
      error: 'InvalidRegistration' 
     }] 
    } 
    sender.send.returns(Q.resolve(gcmReturn)); 
    return fixtureService.clearDatabase() 
     .then(function() { 
      return fixtureService.load('./test/subscription-push.json'); 
     }) 
     .then(function() { 
      return notificationService.sendSpecificNotification(); 
     }); 
    }); 

答えて

0

あなたはsinonスタブメソッドを使用してみましたが?例:あなたはすべてのスタブのメソッドを使用していない

it('Subscription Push', function() { 
    var sender = sinon.createStubInstance(gcm.Sender); 
    var gcmReturn = { 
     multicast_id: 1, 
     success: 1, 
     failure: 1, 
     canonical_ids: 1, 
     results: [{ 
      registration_id: 'xxxx', 
      message_id: 'yyy' 
     }, { 
      error: 'InvalidRegistration' 
     }] 
    } 
    sender.send.returns(Q.resolve(gcmReturn)); 
    return fixtureService.clearDatabase() 
     .then(function() { 
      return fixtureService.load('./test/subscription-push.json'); 
     }) 
     .then(function() { 
      return notificationService.sendSpecificNotification(); 
     }); 
}); 

UPDATE

、notificationService上で自動的にメソッドをスタブここ舞台裏で起こっ魔法はありません。作成した送信者を使用するか、メソッドをスタブするだけで直接notificationServiceに送信する必要があります。

it('Subscription Push', function() { 
    var sender = sinon.createStubInstance(gcm.Sender); 
    var gcmReturn = { 
     multicast_id: 1, 
     success: 1, 
     failure: 1, 
     canonical_ids: 1, 
     results: [{ 
      registration_id: 'xxxx', 
      message_id: 'yyy' 
     }, { 
      error: 'InvalidRegistration' 
     }] 
    } 
    sender.send.returns(Q.resolve(gcmReturn)); 
    return fixtureService.clearDatabase() 
     .then(function() { 
      return fixtureService.load('./test/subscription-push.json'); 
     }) 
     .then(function() { 
      // Here you should be using sender.sendSpecificNotification(); 
      // Alternatively, you could simply stub out the method 
      // on the notificationService directoy and avoid using the sender at all. 
      // To stub out the method on the notificationService do this: 
      // sinon.stub(notificationService, 'send', function() { return Q.resolve(gcmReturn); }); 
      return notificationService.sendSpecificNotification(); 
     }); 
}); 
+0

私は 'TypeError例外を取得:すでにsender.send.returns(gcmReturn)にその最後の行を変更してみてください – Sydney

+0

をwrapped'された送信ラップしようとしました。 – grimurd

+0

私はもうエラーはありませんが、スタブは 'sendSpecificNotification'メソッドで使われていません。基本的にテストがタイムアウトします。 – Sydney