Проблема с заглушкой функции, которая возвращает обещание - мокко - PullRequest
0 голосов
/ 06 октября 2019

Я новичок в написании юнит-тестов в мокко чай. У меня есть одна функция с именем appStore:

public appStore(name) {
    return this.connector.findOne(name).then((record) => {
      if (!record) {
        throw new Error("Record not found");
      }
      return record.data;
    });
  }

Здесь record.data - это объект, который содержит:

{ 
    a: "ValueA", 
    b: "ValueB", 
    c: "ValueC" 
}

Я попытался заглушить функцию. Но не могу получить его правильно.

import myClass from "testClass.service";
describe("MyModule", () => {
  const sandbox = sinon.createSandbox();
  let valTest;
  beforeEach(() => {
    const userObj = { 
        a: "ValueA", 
        b: "ValueB", 
        c: "ValueC" 
    };
    valTest = sandbox.stub(myClass , "appStore").returns(userObj );
  });
  afterEach(() => {
    sandbox.restore();
  });
  it("myfunc1 is a proxy for myfunc2", () => {

     expect(myClass.appStore("dataname")).to.eql(userObj );
  });
});

Пожалуйста, поправьте меня, если я ошибаюсь, так как я новичок в этом. Любая помощь будет очень признательна.

Заранее спасибо.

1 Ответ

0 голосов
/ 06 октября 2019

Как правило, вы не захотите заглушать методы в классе, а только в одном объекте этого класса. Чтобы вернуть обещание, используйте resolves() вместо returns().

import myClass from "testClass.service";
describe("MyModule", () => {
  const sandbox = sinon.createSandbox();
  const myInstance = new myClass();
  let valTest;
  beforeEach(() => {
    const userObj = { 
        a: "ValueA", 
        b: "ValueB", 
        c: "ValueC" 
    };
    valTest = sandbox.stub(myInstance , "appStore").resolves(userObj );
  });
  afterEach(() => {
    sandbox.restore();
  });
  it("myfunc1 is a proxy for myfunc2", () => {

     expect(myInstance.appStore("dataname")).to.eql(userObj );
  });
});

Если вы действительно хотите заглушить нестатический метод для всех объектов, производных от определенного класса, вы должны сделать это на прототипе.

sandbox.stub(myClass.prototype, "appStore").resolves(userObj);

Метод appStore все еще не существует в самом классе, но вы можете убедиться, что заглушка работает с использованием любого объекта.

expect((new myClass).appStore("dataname")).to.eql(userObj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...