我想知道是否有人可以给我一些关于设计我的单元测试的指示,特别是测试中的功能出现在测试本身而不是单元的动作中。
我正在使用节点编写服务器端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.");
});
});
}
已编辑:我编写了一个截断数据库表进行清理的函数,但仍然希望了解如何改进测试的指针。
答案 0 :(得分:0)
这不是单元测试,因为它有副作用。当然,您无法使用您正在测试的“删除”功能。它通过单元测试后才会存在。您的单元测试需要是单元测试。
您可能希望将数据库连接作为依赖注入,作为抽象数据存储。单元测试将使用模拟数据存储区。