Тестовое двойное использование td.when не вызывается внутри td.object
Вероятно, я неправильно понимаю Testdouble, но я создал этот пример, чтобы проиллюстрировать проблему, с которой я столкнулся:
const test = require("ava");
const td = require("testdouble");
const reducer = async (state, event) => {
if (event.id === "123") {
const existing = await state.foo("", event.id);
console.log("existing:", existing);
}
};
test("foo", async (t) => {
const foo = td.func(".foo");
const state = td.object({
foo
});
td.when(foo(td.matchers.anything(), td.matchers.anything())).thenResolve({
id: "123"
});
await reducer(state, {
id: "123",
nickname: "foo"
});
});
Это журналы:
existing: undefined
Принимая во внимание, что я считаю, что он должен регистрировать:
existing: { id: "123" }
как заявил
td.when()
Что мне не хватает?
1 ответ
Я думаю, что ваша проблема в том, чтоtd.object
не работает так, как вы думаете:
td.object(realObject)
- возвращает глубокую имитацию переданного объекта, где каждая функция заменяется тестовой двойной функцией, названной в соответствии с путем к свойству (например, еслиrealObject.invoices.send()
была функцией, возвращаемый объект имел бы свойствоinvoices.send
установить тестовый двойник с именем'.invoices.send'
)
Источник: https://github.com/testdouble/testdouble.js#tdobject
Итак, когда вы делаете…
const foo = td.func();
const obj = td.object({foo});
… ты на самом деле издеваешьсяfoo
дважды.
Вот демо:
const td = require('testdouble');
const num2str = td.func('num->string');
td.when(num2str(42)).thenReturn('forty two');
td.when(num2str(43)).thenReturn('forty three');
td.when(num2str(44)).thenReturn('forty four');
const x = {num2str};
const y = td.object({num2str});
num2str(42);
x.num2str(43);
y.num2str(44);
Тогда мы можем осмотретьx.num2str
и мы можем видеть, что это тот же тестовый дубль, что иnum2str
:
td.explain(x.num2str).description;
/*
This test double `num->string` has 3 stubbings and 2 invocations.
Stubbings:
- when called with `(42)`, then return `"forty two"`.
- when called with `(43)`, then return `"forty three"`.
- when called with `(44)`, then return `"forty four"`.
Invocations:
- called with `(42)`.
- called with `(43)`.
*/
Однакоy.num2str
совершенно другой тестовый двойник:
td.explain(y.num2str).description;
/*
This test double `.num2str` has 0 stubbings and 1 invocations.
Invocations:
- called with `(44)`.
*/
Я думаю, что вы ищете поведение "замены свойства"td.replace
:
const z = {
str2num: str => parseInt(str),
num2str: num => {
throw new Error('42!');
}
};
td.replace(z, 'num2str');
td.when(z.num2str(42)).thenReturn('FORTY TWO!!');
The z.str2num
функция не подвергалась насмешкам:
z.str2num("42");
//=> 42
Однакоz.num2str
является полноценным тестовым двойником:
z.num2str(42);
//=> 'FORTY TWO!!'
td.explain(z.num2str).description;
/*
This test double `num2str` has 1 stubbings and 1 invocations.
Stubbings:
- when called with `(42)`, then return `"FORTY TWO!!"`.
Invocations:
- called with `(42)`.
*/