如何断言RxJS中of与throwError函数的返回值?
解决RxJS Observable实例断言失败的问题
你用assert.equal(或assert.strictEqual)直接比较Observable实例会失败,核心原因是每个Observable都是独立的对象实例——哪怕行为完全一致,它们的内存引用也不相同。equal系列方法本质是做引用相等性检查,因此直接比较Observable实例必然返回false。
以下是具体的解决方案:
方法1:订阅Observable,验证实际输出/错误
不要直接比较实例,而是订阅Observable,检查它发出的值或抛出的错误是否符合预期。修正后的测试代码示例:
// example.test.ts import { strictEqual, rejects } from "assert"; import { exampleThrow, exampleOf } from "./example"; import { firstValueFrom } from "rxjs"; // 测试exampleOf async function testExampleOf() { const result = await firstValueFrom(exampleOf(new Error("Test"))); strictEqual(result, {}); // 验证发出的值是否为预期的空对象 } // 测试exampleThrow async function testExampleThrow() { const testError = new Error("Test"); await rejects(firstValueFrom(exampleThrow(testError)), (err) => { strictEqual(err, testError); // 验证抛出的错误是否为传入的实例 return true; }); } // 执行测试 testExampleOf().catch(console.error); testExampleThrow().catch(console.error);
这里用firstValueFrom将Observable转换为Promise,配合async/await简化异步测试逻辑,再通过断言验证实际输出。
方法2:使用RxJS官方测试工具(TestScheduler)
如果是复杂的Observable流,推荐用RxJS的TestScheduler做marble测试,能精准验证流的时序和输出:
// example.test.ts import { strictEqual } from "assert"; import { TestScheduler } from "rxjs/testing"; import { exampleThrow, exampleOf } from "./example"; const testScheduler = new TestScheduler((actual, expected) => { strictEqual(JSON.stringify(actual), JSON.stringify(expected)); }); // 测试exampleOf testScheduler.run((helpers) => { const { expectObservable } = helpers; const source = exampleOf(new Error("Test")); // 预期流立即发出{},然后完成 expectObservable(source).toBe("(a|)", { a: {} }); }); // 测试exampleThrow testScheduler.run((helpers) => { const { expectObservable } = helpers; const testError = new Error("Test"); const source = exampleThrow(testError); // 预期流立即抛出指定错误 expectObservable(source).toBe("#", null, testError); });
额外修正:业务代码的语法错误
你的example.ts存在导出语法错误,正确写法如下:
// example.ts import { of, throwError } from "rxjs"; export const exampleThrow = (error: Error) => { return throwError(() => error); } export const exampleOf = (error: Error) => { return of({}); }
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

