茉莉花单元测试中的模拟助手类

时间:2019-02-14 11:28:37

标签: angular unit-testing jasmine testbed

我想对使用辅助类的角度组件进行单元测试。辅助类及其功能不应成为该测试的一部分,而应被模拟。 该组件可能如下所示:

import { MyHelperClass } from "./my-helper-class";

export class MyComponent {
    public doStuff() {
        const helper = new MyHelperClass();
        if (helper.check()) {
            // code I want to test
        }
    }
}

我想从单元测试中排除helper.check()的功能,只是假设它返回true(或者在第二次测试中为false)。所以我希望我的测试看起来像这样:

it("#doStuff should do something, assuming helper.check() is true, () => {
    // make constructor of MyHelperClass return a Mock
    // (or somehow spy on helper.check() and return true?) 

    expect(component.doStuff()).toBe(someValue);
});

1 个答案:

答案 0 :(得分:0)

您可以设置一个间谍,该间谍可以模拟函数调用并返回check()所需的任何值。它还可以让您检查该功能(例如,间谍实际上已被调用以及执行了多少次等)。

棘手的部分是,如果您没有该类的实例,则需要在该类的prototype上设置间谍。

看看下面的代码(dummyVariable只是一个变量,用于测试check()之后的代码是否已执行):

it('doStuff should do something, assuming helper.check() is true', () => {
  // test the before value
  expect(component.dummyVariable).toBe(false);

  // set up the spy and make it return true
  const spy = spyOn(MyHelperClass.prototype, 'check').and.returnValue(true);

  // call our function
  component.doStuff();

  // check the after value
  expect(component.dummyVariable).toBe(true);

  // check if our spy/mocked function was actually called
  expect(spy).toHaveBeenCalledTimes(1);
});

// same thing as above but this time our spy returns false
it('doStuff should do something, assuming helper.check() is false', () => {
  expect(component.dummyVariable).toBe(false);
  const spy = spyOn(MyHelperClass.prototype, 'check').and.returnValue(false);
  component.doStuff();
  expect(component.dummyVariable).toBe(false);
  expect(spy).toHaveBeenCalledTimes(1);
});
  

您可以找到一个有效的例子   here