被测试的方法出现在单元测试中而非动作中

时间:2016-01-15 21:26:47

标签: javascript unit-testing rsvp.js

我想知道是否有人可以给我一些关于设计我的单元测试的指示,特别是测试中的功能出现在测试本身而不是单元的动作中。

我正在使用节点编写服务器端javascript,并使用rsvp对异常后端进行异步调用。

我按如下方式构建单元测试。

//Setup
//Action
//Assertion
//Cleanup

现在,我正在构建一个异步删除数据库中的enteries的函数,因此我的单元测试看起来像这样。

"deletingFunction_1entry_returns1EntryDeleted": function() {
      return new rsvp.Promise(function( resolve, reject ) {
      //Setup
      var DatabaseEntry = { "Info": "Info" };
      setup( DatabaseEntry ).then(function( xPostedEntries ) {
      //if the setup promise resolves then...
          //Action
          xDelete( xPostedEntries ).then(function( xDeletedEnteries ) {
              //Assertion
              if ( xPostedEntries === xDeletedEntries ) {
              //if the posted enteries matched the deleted enteries then...
                  resolve();
              } else {
              //otherwise the posted enteries did not match the deleted  
              //enteries so...
                  reject("The posted enteries did not match the deleted enteries.");
              }    
          });
      }, function( xPostedEnteries ) {
      //otherwise the setup promise did not resolve so...
          //Cleanup
          /***************************************************************/
          /* Here's where I'm having trouble. If the setup fails to post */
          /* all of the entries to the database then the test is a       */                              
          /* scratch but I want to clean up all the posts that 'were'    */
          /* posted but to remove them from the database, I'd be using a */
          /* deleting function, which is the function that I'm testing.  */
          /* So how can I redesign my unit test not to use the function  */
          /* that it's testing.                                          */
          /***************************************************************/
          reject("The setup failed.");   
      });
});

}

已编辑:我编写了一个截断数据库表进行清理的函数,但仍然希望了解如何改进测试的指针。

1 个答案:

答案 0 :(得分:0)

这不是单元测试,因为它有副作用。当然,您无法使用您正在测试的“删除”功能。它通过单元测试后才会存在。您的单元测试需要是单元测试。

您可能希望将数据库连接作为依赖注入,作为抽象数据存储。单元测试将使用模拟数据存储区。