You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何断言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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:16:01