如何spyOn内部方法并返回所需的值?

时间:2018-04-26 22:29:18

标签: unit-testing ionic-framework jasmine karma-runner angular5

我一直在尝试更改从我正在测试的方法中的提供程序返回方法的值。

我需要强制bdbPlatforms.isBrowser()返回false

我知道可以调用spyOn()方法并更改它返回的内容:

spyOn(bdbPlatforms, 'isBrowser').and.returnValue(false);

但显然没有开火,因为当我尝试:expect(bdbPlatforms.isBrowser()).toHaveBeenCalled();它失败了。

测试用例如下所示:

describe('navigation provider: test', () => {
let navigation: NavigationProvider;
let navCtrlSpy;
let bdbPlatformsSpy;

beforeEach(() => {
    navCtrlSpy = jasmine.createSpyObj('NavController', ['setRoot']);
    bdbPlatformsSpy = jasmine.createSpyObj('BdbPlatformsProvider', ['isBrowser']);
});

afterEach(() => {
    navCtrlSpy =  null;
    bdbPlatformsSpy = null;
});

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            NavigationProvider,
            {
                provide: BdbPlatformsProvider,
                useClass: MockBdbPlatformsProvider
            },
            {
                provide: ModalController,
                useClass: ModalControllerMock
            },
            Platform
        ],
    }).compileComponents();
    navigation = TestBed.get(NavigationProvider);
});

it('should open Master page', () => {
    navigation.platformSelect(navCtrlSpy);
    expect(navCtrlSpy.setRoot).toHaveBeenCalledWith('MasterPage');
});

it('should open Tabs page', () => {
    navigation.platformSelect(navCtrlSpy);
    bdbPlatformsSpy.isBrowser.and.callFake(() => {
        return false;
    });
    expect(navCtrlSpy.setRoot).toHaveBeenCalledWith('TabsPage');
});

});

这是测试类中的方法:

platformSelect() {
 if(this.bdbPlatforms.isBrowser()){
   this.navCtrl.setRoot('MasterPage');
 } else {
   this.navCtrl.setRoot('TabsPage');
 }
}

测试失败并显示消息

  

使用['TabsPage']调用预期的间谍setRoot,但实际调用是['MasterPage']。

表示该值未在运行时更改。是否有可能在同一方法中间谍两次?如果不使用像callFake这样的东西可能有用吗?

2 个答案:

答案 0 :(得分:1)

spyOn(bdbPlatforms, 'isBrowser').and.callFake(function(){
    return false;
});

说明:第一个参数是对象(如果有),第二个是spyOn的方法,然后回调只返回你想要返回的值(模拟值或预定义值)

https://jasmine.github.io/2.0/introduction.html#section-Spies

答案 1 :(得分:1)

您需要更正测试床中的BdbPlatformsProvider条目。 尝试执行以下操作:

1。创建bdbPlatforms的间谍。

    let bdbPlatformsSpy = jasmine.createSpyObj('BdbPlatformsProvider', ['isBrowser']);
    bdbPlatformsSpy.isBrowser.and.callFake(function () {
        return false;
    });


2。在测试床中添加它的条目如下:

TestBed.configureTestingModule({

      declarations: [
        ..............
      ],

      providers: [
        ..............

        {
          provide: BdbPlatformsProvider,
          useValue: bdbPlatformsSpy
        }
        ..............
      ],

      imports: [
        ............
      ]

    }).compileComponents();

  }));


然后它应该工作。