使用jasmine模拟Ext.data.StoreManager方法调用

时间:2016-09-06 19:03:55

标签: unit-testing extjs jasmine

我想在单元测试的函数中有以下代码行:

var myStore = Ext.data.StoreManager.lookup("MyStore");

我试图在我的单元测试中模拟商店,如下所示:

spyOn(Ext, 'data').and.returnValue({
    StoreManager: {
        lookup: function() {
         return myMockStoreObjectForTestingPurposes;
        }   
    }
});

但是,由于某种原因,单元测试试图使用Ext.data返回的真实对象而不是我的模拟对象。

任何人都知道为什么会这样吗?我应该以不同的方式嘲笑Ext.data.StoreManager吗?

2 个答案:

答案 0 :(得分:1)

Jasmine正在期待数据'成为一个功能,它实际上是一个对象。

我可以在这里看到三种解决方案,最简单的方法是监视Ext.data.StoreManager,类似于:

spyOn(Ext.data.StoreManager, 'lookup').and.callFake(function() {
     return myMockStoreObjectForTestingPurposes;   
});

这实际上会用你的" fake"替换每个查询调用。功能

第二个是在测试中完全替换Ext对象,如:

beforeEach(
        module('your-module-name', function ($provide) {
            var mockedExt = {
               data: { 
                  StoreManager: {
                      lookup: function() {
                          return myMockStoreObjectForTestingPurposes;
                      }   
                  }
               }
            };
            $provide.value('Ext', mockedExt);
        })
    );

这是用mockedExt替换每次注入Ext

最后一个解决方案几乎与上面的解决方案相同,但是你直接将其传递给控制器​​(假设您正在测试控制器),例如:

beforeEach(
        inject(function (_$controller_) {
            var mockedExt = {
               data: { 
                  StoreManager: {
                      lookup: function() {
                          return myMockStoreObjectForTestingPurposes;
                      }   
                  }
               }
            };
            var myController = _$controller_('MyControllerName', {
                Ext: mockedExt
            });
        })
    );

希望有所帮助:)

答案 1 :(得分:0)

我相信你应该尝试使用and.callFake而不是and.returnValue,它应该返回你的模拟对象。如果我是对的,你可以在这里阅读更多内容:

http://jasmine.github.io/2.0/introduction.html

祝你好运。