Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过监视可观察的angularfire2进行单元测试?_Angular_Angularfire2 - Fatal编程技术网

如何通过监视可观察的angularfire2进行单元测试?

如何通过监视可观察的angularfire2进行单元测试?,angular,angularfire2,Angular,Angularfire2,尝试删除angluarfire2以用于我的服务。现在我得到的错误是::应该是间谍,但得到了函数。 我如何安排事情以便我能打电话?我想让东西尽可能重复使用 import { TestBed } from '@angular/core/testing'; import { AngularFirestore } from '@angular/fire/firestore'; import { of } from "rxjs"; import { FirebaseService } from './f

尝试删除angluarfire2以用于我的服务。现在我得到的错误是:
:应该是间谍,但得到了函数。

我如何安排事情以便我能打电话?我想让东西尽可能重复使用

import { TestBed } from '@angular/core/testing';
import { AngularFirestore } from '@angular/fire/firestore';

import { of } from "rxjs";
import { FirebaseService } from './firebase.service';
describe('FirebaseService', () => {

let service: FirebaseService;

let collectionSpy = jasmine.createSpy("collection").and.callFake((path: string) => {
    return of([{
    title: "Example Post",
    body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla commodo dui quis.",
    }]);
});

let afStub: any = {
    collection:()=>{
    return {
        valueChanges:collectionSpy
    }
    }
};

beforeEach(() => {
    TestBed.configureTestingModule({
    providers:[
        { provide: AngularFirestore, useValue: afStub }
    ],      
    })
    service = TestBed.get(FirebaseService); 
});

it('should have a list method', () => {
    afStub.collection('fakeCollection').valueChanges(); //calling directly to see if it works (which it doesn't)
    expect(afStub.collection).toHaveBeenCalledWith('fakeCollection')
});

});
更新此答案以显示
valueChanges()
方法中返回的可观察值

您之所以会出现错误,是因为您专门将
集合设置为函数,而不是声明为间谍:

let afStub: any = {
    collection:()=>{
    return {
        valueChanges:collectionSpy
    }
    }
};
您可以简单地将集合声明为一个间谍(例如使用
jasmine.createSpy()
),但我认为您的问题比这个简单的解决方案更深一层,因此我编写了一个示例来展示如何进行类似的测试。请随意使用您自己的服务实现进行编辑,因为我现在只提供了一个简化版本

对于spy(在服务中模拟/替换
AngularFirestore
),我使用了嵌套的spyObject,因为我个人认为该语法更简单、更简洁,但您可以使用
createSpy
手动构建一个Spie对象来模拟
AngularFirestore
。我是这样宣布的:

const ReturnResult = {
    title: "Example Post",
    body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla commodo dui quis."
};
const collectionSpy = jasmine.createSpyObj({
    valueChanges: of(ReturnResult)
})
const afSpy = jasmine.createSpyObj('AngularFirestore', {
    collection: collectionSpy
});
然后在我为测试而创建的模拟服务中,我创建了
list()
方法,因为这似乎就是您要测试的,并将您在下面的注释中提到的订阅放入其中。像这样:

list() {
    this.firebaseService.collection('fakeCollection').valueChanges().subscribe(x=>console.log(x));
}
然后,我将规范更新为以下内容:

it('should have a list method', () => {
    service.list();
    expect(collectionSpy.valueChanges).toHaveBeenCalled();
    expect(afSpy.collection).toHaveBeenCalledWith('fakeCollection');
});
查看Stackblitz中的所有详细信息。如果您单击测试窗口最底部的“Console”,您将看到返回信息打印在控制台日志上,显示结果已传递到Observable上的
.subscribe()
方法


我希望这能有所帮助。

发布你的真实代码,而不是总结:间谍被宣布在哪里至关重要。如果你把它们放错了地方,这可能是它不起作用的原因。存根也是一样,你如何声明和使用它们会产生不同。谢谢你的建议。我已经更新了我的示例。谢谢您的示例,但可观察的是valueChanges函数。因此,我的服务中的调用是this.firebaseService.collection('fakeCollection').valueChanges().subscribe(x=>console.log)
。如何创建一个在collection()函数中包含valueChanges函数的间谍?啊,感谢您提供更多详细信息。我将更新我的答案。:)@JustinYoung-更新了上面的答案和Stackblitz。