2016-12-05 1 views
1

Я хочу издеваться над вызовом базы данных, который возвращает обещание. И затем я хочу проверить, вызвана ли она точными аргументами или нет.Как издеваться над функцией, которая возвращает обещание и проверяет его точными аргументами

func(data) { 
    let formattedData = formatData(data); 
    return DbClient.saveData(formattedData).then(() => { 
     return { "ok": true } 
    }).catch(() => { 
     return { "ok": false } 
    }); 
} 

и мой тестовый случай

it("", (done) => { 
    let dbMock = sinon.mock(DbClient).expects("saveData"); 
    dbMock.returns(Promise.resolve({ "ok": true })); 
    dbMock.withExactArgs(formattedData); 
    func(data).then(resp => { 
     try{ 
     dbMock.verify(); 
     expect(resp).to.deep.equal({ "ok": true }); 
     done(); 
     } catch(err) { 
     done(err); 
     } 
    }) 
}); 

обещание не решает, когда я использую dbMock.withExactArgs(formattedData)

Если я дам правильный formattedData то становится прошло, когда я пытался провалить тест с некоторыми другими аргументами вместо formattedData обещание не разрешается, поэтому я получаю эту ошибку:

Error: timeout of 3000ms exceeded. Ensure the done() callback is being called in this test.

** Когда я удаляю dbMock.withExactArgs(formattedData), мой тест проходит, поскольку макет разрешает обещание.

ответ

0

Я воспроизвел то, что вы описали, используя свой код и добавляя код на основе вашего описания. Единственная проблема в коде, который вы показываете, заключается в том, что func не возвращает свое обещание. Вам необходимо:

function func(data) { 
    let formattedData = formatData(data); 
    return DbClient.saveData(formattedData).then(() => { 
     return { "ok": true } 
    }).catch(() => { 
     return { "ok": false } 
    }); 
} 
+0

Фактически мой func возвращает обещание, которое я забыл упомянуть в коде [обновлено сейчас]. Но все же у меня такая же проблема, она ждет обещания разрешить или отклонить, как упоминалось в вопросе. –

Смежные вопросы