javascript 如何在jasmine中模拟存储库来触发代码块中的THEN?

f4t66c6m  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(99)

我试图通过对基本方法执行简单的jasmine测试来增加项目中的代码覆盖率。在我的控制器中,我有这个:

function fetchStates() {
            $repository.states().all().then(function(data) {
                vm.states = data;
            });
        }

我正在尝试设置VM。但我绝对没有试过让它开火。我可以模拟一个存储库,这样jasmine就不会抱怨它不存在,但是当我尝试运行controller时。fetchStates();它根本不会到达内部代码行。mock $repository的正确方法是什么?states().all().则它将允许VM。状态=数据?

function GetMockFacRepo() {
        var facilityPromise = new Promise((resolve, reject) => {
            resolve({ id: 1 });
        });
        return {
            states: function () {
                return {
                    id: 0,
                    all: function () {
                        then:
                        {
                            return facilityPromise
                        }
                    }
                    
                }
            }
        };
    }
var repo2 = GetMockFacRepo();
spyOn(repo2.states.all, "then").and.callFake(function () { return 1 });
rxztt3cl

rxztt3cl1#

尝试以下操作:

function GetMockFacRepo() {
        var facilityPromise = new Promise((resolve, reject) => {
            resolve({ id: 1 });
        });
        return {
            states: function () {
                return {
                    id: 0,
                    all: function() {
                       // return facilityPromise here so .then works
                       return facilityPromise;
                    }
                    
                }
            }
        };
    }

在Assertvm.states = data;之前,您可能还必须等待promise解析。在Angular 2+中,你可以使用fakeAsync/tickfixture.whenStable()。我不知道Angular 1中可以使用什么。

lg40wkob

lg40wkob2#

它最终成为显式地模拟存储库的组合,创建我自己的promise,而不是使用q,* 和 * 使用async调用控制器构造函数。
回购代码:

var mockRepo = {
            states: function () {
                return {
                    all: function () {                        
                        var items = [];
                        var i = 0;
                        for (i = 0; i < 5; i++) {
                            items.push(i);
                        }
                        var sectionPromise = new Promise((resolve, reject) => {
                            resolve(items);
                        });                        
                        return sectionPromise;
                    }
                }
            },
}

测试:

describe('POC', function () {
        beforeEach(async function () {
            controller = createController();
        });
        it('POC', function () {
            expect(controller.states.length).toEqual(5);
            
        });       
    });

编辑:控制器调用在内部填充states属性的方法,我不必显式调用它来填充属性

相关问题