Исключение «Последовательность не содержит элементов» в ожидании наблюдаемого - PullRequest
0 голосов
/ 29 марта 2019

Я использую методы расширения System.Reactive.Linq для преобразования наблюдаемого в результат в асинхронном методе. Код работает правильно, когда у меня есть ссылка на объект; однако, когда я передаю ноль в метод OnNext, получаемый в результате ожидающий результат выдает

System.InvalidOperationException
 HResult=0x80131509
 Message=Sequence contains no elements.
 Source=System.Reactive
 StackTrace:
  at System.Reactive.Subjects.AsyncSubject`1.GetResult() in D:\a\1\s\Rx.NET\Source\src\System.Reactive\Subjects\AsyncSubject.cs:line 441
  at <namespace>.DataServiceTests.<GetWithInvalidIdShouldReturnNull>d__5.MoveNext() in <local test code>

Я ожидаю, что ожидающий получит нулевое значение. Мой тест выглядит следующим образом:

[Fact]
public async void GetWithInvalidIdShouldReturnNull()
{
    var testId = shortid.ShortId.Generate();
    var result = await myTestOjbect.GetById(testId);
    Assert.Null(result);
}

И метод GetById:

public IObservable<object> GetById(string id)
{
    return Observable.Create((IObserver<object> observer) => {
        var item = this._repository.Get(id);  // This returns null when id is not found in collection
        observer.OnNext(item);
        observer.OnCompleted();
        return Disposable.Empty;
    });
}

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Вот где выдается ваша ошибка: https://github.com/dotnet/reactive/blob/master/Rx.NET/Source/src/System.Reactive/Subjects/AsyncSubject.cs#L441

Похоже, у вашего объекта нет наблюдателей или наблюдатели уже удалены.

0 голосов
/ 29 марта 2019

Работает нормально для меня, хотя я сделал это в Linqpad. Вот мой код:

async Task Main()
{
    var result = await GetById("");
    if(result == null)
        Console.WriteLine("OK!");
    else
        throw new Exception("Expected Null!");

}

public IObservable<object> GetById(string id)
{
    var o = Observable.Create<object>(obs =>
    {
        obs.OnNext(null);
        obs.OnCompleted();
        return Disposable.Empty;
    });

    return o;
}
...