gpt4 book ai didi

angular - 使用 stub 测试 Angular 服务

转载 作者:行者123 更新时间:2023-12-04 10:15:42 25 4
gpt4 key购买 nike

我遇到的问题是,每个测试都应该能够以任何顺序运行,但是,我希望能够测试不同的结果。

我的 DataStorageService 是一项外推所用存储的服务。比如LocalStorage、NoSQL等都可以用,但是我的主代码会继续调用DAtaStorageService。我只是更改实现以使用我需要的任何模块或它们的组合。

这是测试设置之外的示例 block 。

const BadData:Observable<ITestInterface> = of<ITestInterface>( { Key_: 'Bad', Name: 'Bad Record for Testing' } );
const GoodData:Observable<ITestInterface> = of<ITestInterface>( { Key_: 'Good', Name: 'Good Record for Testing' } );
const NoKey:Observable<ITestInterface> = of<ITestInterface>( { Name: 'Missing Key for Testing' } );

describe('DataStorage Service - Mocked AngularFire Responses', () => {
let ServiceUnderTest:DataStorage<ITestInterface>;
let DependentService:AngularFireDatabase;

const ObjectStub = {
valueChanges: jasmine.createSpy('valueChanges').and.returnValue(GoodData)
};

const AfDbStub = {
object: jasmine.createSpy('object').and.returnValue(ObjectStub)
};

afterEach(() => {
DependentService = null;
ServiceUnderTest = null;
});

beforeEach(() => {
TestBed.configureTestingModule({
providers: [
DataStorage,
{ provide: AngularFireDatabase, useValue:AfDbStub }
]
});
DependentService = TestBed.inject(AngularFireDatabase);
ServiceUnderTest = TestBed.inject(DataStorage);
});

然后我的问题是如何继续设置要返回的 stub 。我正在编写测试来处理成功返回、负返回等。但是,当我看到 stub 返回的构建时,返回一个值,这些似乎都是单一样式的返回,除非你配置第一个返回,第二个返回,然后是第三个,依此类推。

该示例注入(inject)了一项服务,但它只有一个来自 AngularFire 服务的 stub 供我的代码使用。因此,我需要为三个不同的测试中的每一个都做这个完整的 block 。有没有办法在没有 3 个不同的描述 block 的情况下做到这一点?我知道我可以将其设置为第一次调用、第二次调用和第三次调用获得 3 个返回,并且每个测试都会进行适当数量的调用,但是这感觉不对。

但是,由于我想测试成功、失败、丢失数据,以指定顺序返回数据的模拟,意味着我的测试必须按该顺序运行,这意味着它们并不是真正独立的。这是正确的,还是我只是做一些简单的事情,比如返回不同的设置,对否定的测试会使第一次调用得到肯定的结果,然后在同一个测试中进行第二次调用,所以它返回失败并测试结果?

编辑:我也相信我的 spy / stub 设置不正确,无法与底层的 Angularfire 一起使用。我的问题仍然是关于替换的,但也许 spy 可以在返回中设置函数以允许我检查变量并返回好、坏或错误?

最佳答案

在测试服务的情况下,我更喜欢这样的东西:

{ provide: AngularFireDatabase, useValue: {} } // simple empty object

然后在每个测试中你可以使用 spyOn模拟某些结果的函数,例如:

it('success', () => {
spy = jasmine.spyOn(dependentService, 'method').andReturn(42);

expect(service.method()).toEqual(...);
expect(spy).toHaveBeenCalled();
});

在这种情况下,您可以轻松地操纵依赖服务在不同测试场景中的行为方式。

关于angular - 使用 stub 测试 Angular 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61070237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com