3

モックする必要がある async(.net 4.5) メソッドでクラスを封印しました。私は Microsoft Fakes を使用しているため、それらは「シム」になります。次のコードは、私がしなければならないことの例です。ビルドされますが、実行時に「Login」コントローラー メソッド内の「LoginAsync」メソッドが呼び出されると、テストがハングします。

  [TestMethod]
  public async Task LoginPost_Returns() {

     using (ShimsContext.Create()) {
        var c = new TestController();
        var user=new User();

        Fakes.ShimUserManager.AllInstances.LoginAsyncString = (um, u) => new Task<IUser>(() => { return user; });

        //call controller method  
        var result = await c.Login(model, returnUrl) as ViewResult;
        var expectedViewName = "Index";
        Assert.IsNotNull(result);
        Assert.AreEqual(expectedViewName, result.ViewName);
     }

//Controller method
public async Task<ActionResult> Login(LoginModel model, string returnUrl) {
     var user = await UserManager.LoginAsync(model.UserName, model.password);
     return View();
}
4

2 に答える 2

9

コードでTaskコンストラクターを使用しないでください。戻り値付きasyncの完了が必要な場合は、次を使用します。TaskTask.FromResult

IUser user = new User();
Fakes.ShimUserManager.AllInstances.LoginAsyncString = (um, u) => Task.FromResult(user);

追加のヒントとして、単体テストでこれらのケースをカバーすることをお勧めします。

  • 同期成功 ( Task.FromResult(user))。
  • 非同期成功 ( Task.Run(() => user))。
  • 非同期エラー ( Task.Run(() => { throw new InvalidOperationException("or whatever"); return user; }))。
于 2013-06-21T00:23:00.813 に答える