2017-01-12 6 views
1

私は以下の(簡略化した)コードを持っています。私は完全には理解していないモックによるNunitテスト。インタフェースのインスタンス

ノート、射出ユニットテストとして
public static void Register(Container container) 
{ 
    container.Register<IService, Service>(); 
} 

は私に新たに追加されました。このような

public class Controller 
{ 
    private readonly IService _service; 

    public Controller(IService service) 
    { 
     _service = service; 
    } 

    public async Task<IHttpActionResult> Create(MyObject object) 
    { 
     var result = _service.method(object); 
     if (!result.Succeeded) 
     { 
      return this.GetErrorResult(object); 
     } 
    } 
} 

とSimpleInjectorは_serviceとその実装クラス間の依存関係を注入するために使用され、彼らは、しかし、学習しています。

私がSwaggerでアプリケーションを実行すると、すべて正常に動作しています。

スワッガーでアプリケーションを実行すると、Register関数が呼び出されます。

今、私はセットアップにNUnitのを使用して、いくつかのユニットテストをしようとしていますが、このようなIServiceオブジェクトのモックています:

var Service = new Mock<IService>(); 
Controller _controller = new Controller(Service.Object); 
_controller.Create(new MyObject object()); 

これまでの私には正しいように思われる - 私はわからないが?

ユニットテストの場合、resultは常にヌルです - 私のインターフェースのモックに問題があると思われます - それはメソッドを見つけているようには見えません。彼はデバッガにintを表示しません。

単体テストでは、Registerメソッドが呼び出されません。私はそれを依存関係を登録するために呼び出すよう試みましたが、それは助けにはなりません。

私が上に述べたように、これは私には全く新しいものであり、私はこのすべてについて私の理解の端に立っています。

私は考えが尽きていて、ここからどこを見るかわからないので、どんな助けでも大歓迎です。

EDIT:

元の質問には、次のいた:

私が更新した
public async Task<IHttpActionResult> Create(string content) 

public async Task<IHttpActionResult> Create(MyObject object) 

誰もが私がMyObjectに、一般的な参照を渡すことができますどのように助言することができますこのクラスのインスタンスを作成する必要はありません。

基本的に、このクラスのインスタンスは、そのインスタンスを作成せずに渡されることを伝えたいと思います。

私は次のことを試してみました:

Service.Setup(x => x.method(It.IsAny<MyObject>()) 

but it says cannot convert MethodGroup to MyObject 

、ここではIServiceの定義です:

public interface IService 
{ 
     IdentityResult method(ApplicationUser user, UserLoginInfo login); 
} 
+1

右。テストのためにやりたいことをするためにモックをセットアップする必要があります。クイックスタートはこちらhttps://github.com/Moq/moq4/wiki/Quickstart – Nkosi

+0

モックオブジェクトでモックセットアップをしましたか? – ganeshran

+1

@Alex、単純化された例を削除して、必要なものを正確に尋ねる必要があるかもしれません。私たちは推測のままにされるためです。あなたが広範なAsp.Net Identityフレームワークを使っているようです。具体的に絞り込んでください – Nkosi

答えて

2

var Service = new Mock<IService>(); 
Service.Setup(x => x.method(It.IsAny<string>()) 
    .Returns<string>(str => **whatever result you need**); 

実際IService定義を追加することで、あなたはにSetup呼び出しを変更する必要があります。

Service.Setup(x => x.method(It.IsAny<ApplicationUser>(), It.IsAny<UserLoginInfo>()) 
    .Returns<ApplicationUser, UserLoginInfo>((user, login) => new IdentityResult(true)); 
+0

@chrisePickford私の編集を手伝ってもらえますか? – Alex

+1

あなたの質問に「IService」の定義を追加してください。 –

+0

私はIService定義 – Alex

3

設定方法は、モックオブジェクトで呼び出される必要があります。

あなたは次のように IService.methodのために何かを返すように Mockオブジェクトを設定する必要があり
var Service = new Mock<IService>(); 
Service.Setup(x=>x.method("argument")).Returns(YourReturnObject) 
Controller _controller = new Controller(Service.Object); 
+0

私の編集を手伝ってもらえますか? – Alex

2

簡略化された例を使用

public class Controller 
{ 
    private readonly IService _service; 

    public Controller(IService service) 
    { 
     _service = service; 
    } 

    public async Task<IHttpActionResult> Create(string content) 
    { 
     var result = await _service.method(content); 
     if (!result.Succeeded) 
     { 
      return this.GetErrorResult(result); 
     } 
     return Ok(); 
    } 
} 

はIServiceがセットアップに必要なユニットテストのために

public interface IService { 
    Task<Result> method(string input); 
} 

public class Result { 
    public bool Succeeded { get; set; } 
} 

として定義されたアクションは、テスト対象のメソッドがあることを考えると、テスト

public async Task Controller_Given_Content_Should_Return_Ok() { 
    //Arrange 
    var input = "content"; 
    var mockService = new Mock<IService>(); 
    mockService 
     .Setup(m => m.method(input)) 
     .ReturnAsync(new Result { Succeeded = true }); 
    var _controller = new Controller(mockService.Object); 

    //Act 
    var result = await _controller.Create(input); 

    //Assert 
    Assert.IsNotNull(result); 
    Assert.IsInstanceOfType(result,typeof(OkResult)); 
} 

ために望んでいた偽のモックと仮定しましょう非同期でもテストを非同期に設定する必要があります。

+0

私の編集を手伝ってもらえますか? – Alex

関連する問題