zer*_*ing 7 javascript rxjs rxjs5
我带了这本书rxjs in action,刚刚完成测试部分.
测试rxjs代码与通常的测试不同,因为一切都是延迟加载.
在书中,他们提到了两种测试方法,要么传递完成(我使用的是QUnit,完成信号,异步代码完成)或大理石图.
我的问题是,我应该选择哪种方法,我上面提到过?
Eri*_*ton 10
时间过去了,现在绝对有可能(甚至很容易)使用TestScheduler. 它们是一种以易于理解的格式全面测试随时间推移的排放、错误、完成和订阅的好方法。这是他们文档中的示例:
import { TestScheduler } from 'rxjs/testing';
const testScheduler = new TestScheduler((actual, expected) => {
// asserting the two objects are equal
// e.g. using chai.
expect(actual).deep.equal(expected);
});
// This test will actually run *synchronously*
it('generate the stream correctly', () => {
testScheduler.run(helpers => {
const { cold, expectObservable, expectSubscriptions } = helpers;
const e1 = cold('-a--b--c---|');
const subs = '^----------!';
const expected = '-a-----c---|';
expectObservable(e1.pipe(throttleTime(3, testScheduler))).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(subs);
});
});
Run Code Online (Sandbox Code Playgroud)
如果你使用 Jasmine,我写了一个叫做marbleTest()减少样板文件的小助手,可在@s-libs/ng-dev:
import { marbleTest } from "s-ng-dev-utils";
it("generate the stream correctly", marbleTest(helpers => {
const { cold, expectObservable, expectSubscriptions, testScheduler } = helpers;
const e1 = cold(" -a--b--c---|");
const subs = " ^----------!";
const expected = "-a-----c---|";
expectObservable(e1.pipe(throttleTime(3, testScheduler))).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(subs);
}));
Run Code Online (Sandbox Code Playgroud)
我从同事那里得到了很多这个问题.我终于开始记录我在博客上测试RxJ的方法.由于你的问题似乎与RxJs5有关,我只会在这里引用我的帖子的相关部分.
当您将代码库从RxJs4迁移到5时,您会发现很多东西已被移动,重命名,最重要的是TestScheduler的实现不再可用.RxJs贡献者kwonoj创建了一个兼容性垫片,以帮助迁移到RxJs5.您可以使用npm安装它npm install @kwonoj/rxjs-testscheduler-compat.并非TestScheduler的所有功能都已实现,但最重要的.startScheduler是工作.
const TestScheduler = require('@kwonoj/rxjs-testscheduler-compat').TestScheduler;
const next = require('@kwonoj/rxjs-testscheduler-compat').next;
const complete = require('@kwonoj/rxjs-testscheduler-compat').complete;
it('works in RxJs5 with the compat package', () => {
const scheduler = new TestScheduler(); // Note; no longer the Rx.TestScheduler
const results = scheduler.startScheduler(
() => Rx.Observable.interval(100, scheduler).take(3),
{ created: 100, subscribed: 200, unsubscribed: 1000 } // NOTE: disposed is now renamed to unsubscribed
);
collectionAssert.assertEqual(res.messages, [
next(200 + 100, 0),
next(200 + 200, 1),
next(200 + 300, 2),
complete(200 + 300)
]);
});
Run Code Online (Sandbox Code Playgroud)
RxJs团队引入了大理石测试语法,以更直观地定义运算符或自定义代码的运行方式.
var e1 = hot('----a--^--b-------c--|');
var e2 = hot( '---d-^--e---------f-----|');
var expected = '---(be)----c-f-----|';
expectObservable(e1.merge(e2)).toBe(expected);
Run Code Online (Sandbox Code Playgroud)
在撰写这篇文章时,他们还没有使这种方法在RxJs5库本身之外使用起来非常容易.有些实现可以自己查看如何实现.您还可以在RxJs5的代码库中查看,了解如何设置测试框架以进行自己的大理石测试.有关使用RxJs5记录测试的公开问题.我还没有成功地将我的测试框架设置为以这种方式进行大理石测试.
| 归档时间: |
|
| 查看次数: |
4315 次 |
| 最近记录: |