2017-09-21 5 views
2

Subjectクラスまたは.NET eventsクラスを使用せずにこのテストをパスするにはどうすればよいですか?Subjectまたは.NETイベントを使用せずに、メソッド呼び出しで発生するIObservableを作成する方法は?

[TestClass] 
public class ObservableTests 
{ 
    private readonly Subject<Unit> _subject = new Subject<Unit>(); 

    [TestMethod] 
    public void ObservesMethodCall() 
    { 
     var eventCount = 0; 
     IObservable<Unit> observable = _subject.AsObservable(); 
     observable.Subscribe(u => eventCount++); 

     Assert.AreEqual(0, eventCount); 
     Foo(); 
     Assert.AreEqual(1, eventCount); 
    } 

    private void Foo() 
    { 
     _subject.OnNext(Unit.Default); 
    } 
} 

私はthey are not recommendedとしてsubjectsを使用しないようにしたいです。私はRxNetが.NETイベントに取って代わり、.NETイベントを使用したくありません。

関連質問:

Firing an event every time a new method is called
それは私たちが呼び出されるメソッドを変更することはできませんを前提としています。

How to create Observable that emits every time a member variable is updated (onCompleted never called)
件名を使用します。

Is there a way to create an observable sequence triggered by method calls without using Subject?
米国の主題は、行く方法です。しかし、私はまだ被験者なしでそれを行う方法を学びたい。

IObserver and IObservable in C# for Observer vs Delegates, Events
これは、分割の毛のようなビットであるかもしれないが、これは対象を必要とせずに動作するカスタムIObservable

答えて

3

を実装することによって、問題を解決する方法を示しています、要するに

[TestClass] 
public class ObservaleTests 
{ 
    private Action _action = null; 

    [TestMethod] 
    public void ObservesMethodCall() 
    { 
     var eventCount = 0; 

     IObservable<Unit> observable = 
      Observable.FromEvent(a => _action += a, a => _action -= a); 

     observable.Subscribe(u => eventCount++); 

     Assert.AreEqual(0, eventCount); 
     Foo(); 
     Assert.AreEqual(1, eventCount); 
    } 

    private void Foo() 
    { 
     _action(); 
    } 
} 
+0

これはどのように機能するのですか? – VMAtm

+0

@VMAtm - どちらのビットについてはわかりませんか? 'FromEvent'ですか? – Enigmativity

+0

ええ、私はそこに重複を理解していません。 – VMAtm

0

手続き的にオブザーバブルをトリガしたいが、サブジェクトやイベントは使用しない。カスタムデリゲート(@ Enigmativityの回答)を使用することもできますし、IObservableをカスタム実装することもできます(基本的には主題の再発明)。

私は前提に賛成するつもりです。主題を使用してください。彼らは常に推奨されているわけではありませんが、提示されたようにあなたの考案された問題に適合します。

さらに大きな疑問があるのは、手順上、観測可能性をトリガしたい理由です。System.Reactiveの全体のポイントは、メッセージの片側だけを心配することができることです。受信者(観測可能)または送信者(観察者)。あなたは両方のことをしようとしています、それは主題が何であるかです。被験者の問題は、実装の細部やドグマ(被験者が悪い、オブザーバブルが良い)のようなものではありません。送信と受信ではなく、メッセージの受信に集中することが目的です。

+0

問題は発生していません。これは最も一般的なユースケースの1つです。「メソッド呼び出しを観察したいのですが、どうすればいいのですか?」より具体的には、私は何かをトリガするクラスを作成しています。このクラスのインタフェースでIObservableのようなトリガの発生を公開したいと思います。 –

+0

提示された問題は考案されています。私はリンクされた答えのいくつかを読んでみることをお勧めします*なぜ*科目 'は、推奨されていません。 'Subject'の周りには、クラス自体ではなく推薦されないデザインが実際にある傾向にあることがわかります。 – Shlomo

+0

「私は、IObservableとしてメソッド呼び出しを公開したい」から「本質的にSubjectを必要とし、したがって問題が生じた」ということから私には大きなジャンプがあります。Dave Sextonの「Subjectを使用するかどうか、Subjectを使用するかどうか」記事は実際に被験者はこのシナリオのための適切なアプローチであると言うように思われるが、説明は自明ではない。 –

関連する問題