Javascript MergeMap与Promises的大理石测试不产生任何输出

Javascript MergeMap与Promises的大理石测试不产生任何输出,javascript,unit-testing,rxjs,Javascript,Unit Testing,Rxjs,我有一个可观察的source,还有一个函数f,它将source元素转换为Promises。我想将该函数应用于源代码,并使用chai编写一个测试: import { TestScheduler } from 'rxjs/testing/TestScheduler'; import 'rxjs/add/operator/mergeAll'; // expect is from chai const marbles = new TestScheduler((a, b) => expect(a)

我有一个可观察的
source
,还有一个函数
f
,它将
source
元素转换为
Promise
s。我想将该函数应用于
源代码
,并使用chai编写一个测试:

import { TestScheduler } from 'rxjs/testing/TestScheduler';
import 'rxjs/add/operator/mergeAll';
// expect is from chai

const marbles = new TestScheduler((a, b) => expect(a).to.deep.equal(b));
const source = marbles.createColdObservable('a-a-a-a');
const map = source.mergeMap(async a => a);
marbles.expectObservable(map).toBe('a-a-a-a');
marbles.flush();
预期结果是测试通过。实际结果是:

AssertionError: expected [] to deeply equal [ Array(4) ]

为什么可观测值是空的?

我也有同样的问题,结果证明承诺不能像你预期的那样被测试

有关更多详细信息,请参阅本页

总之:

已知问题

您不能直接测试使用承诺或使用任何其他调度程序(例如AsapScheduler)的RxJS代码


我也有同样的问题,结果证明承诺不能像你期望的那样被检验

有关更多详细信息,请参阅本页

总之:

已知问题

您不能直接测试使用承诺或使用任何其他调度程序(例如AsapScheduler)的RxJS代码


当它必须与承诺一起工作时,
expectObservable
中一定有不完美的东西。如果您将
async a=>a
替换为
a=>Observable.of(a)
一切正常。但不幸的是,这不是你的情况。顺便问一下,为什么要将
source
发出的元素转换为承诺?我不想将它们转换为承诺,我是通过一个函数来映射它们的,该函数做了一些作为承诺返回的事情(即使用API的web请求)。所以这似乎是
expectObservable
中的一个bug?奇怪的是,它不应该在意有承诺。它得到的是
mergeMap
之后的一系列值,而不是承诺!是的,这看起来像是一场比赛,但对我来说,即使我不是100%。原因是,如果你用一个返回可观察值的函数来替换返回承诺的函数,那么一切都会正常工作。我试着深入研究一下代码,但它不容易理解,所以我放弃了。
expectObservable
中一定有不完美的东西,当它必须与承诺一起工作时。如果您将
async a=>a
替换为
a=>Observable.of(a)
一切正常。但不幸的是,这不是你的情况。顺便问一下,为什么要将
source
发出的元素转换为承诺?我不想将它们转换为承诺,我是通过一个函数来映射它们的,该函数做了一些作为承诺返回的事情(即使用API的web请求)。所以这似乎是
expectObservable
中的一个bug?奇怪的是,它不应该在意有承诺。它得到的是
mergeMap
之后的一系列值,而不是承诺!是的,这看起来像是一场比赛,但对我来说,即使我不是100%。原因是,如果你用一个返回可观察值的函数来替换返回承诺的函数,那么一切都会正常工作。我曾试图深入研究代码,但不容易理解,所以我放弃了。
// Some RxJS code that also consumes a Promise, so TestScheduler won't be able
// to correctly virtualize and the test will always be really async
const myAsyncCode = () => from(Promise.resolve('something'));

it('has async code', done => {
  myAsyncCode().subscribe(d => {
    assertEqual(d, 'something');
    done();
  });
});