Тестовое двойное использование 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)`.
*/

Другие вопросы по тегам