2016-07-29 4 views
1

私は今、本当に困惑しています。だから、私はWeb APIとプロジェクトのユニットテストに取り組んできましたが、最近は多くのコントローラで変更を加えただけですが、AccountControllerを完全に変更しませんでした。私のAccountControllerには、私がテストするたびに過去2ヶ月間素晴らしい仕事をしていたRegister()関数があります。今、しかし突然、私は登録を入力して呼び出すとき、UserManager.CreateAsyncはユニットテストの実行時にハングアップしますが、郵便番号ではありません

IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

私のプログラムがハングして戻って来ることはありません。私はいくつかのことをテストしましたが、これは単体テストから呼び出されたときにのみ発生します(これも変更されていません)。PostmanからRegisterと同じJSONを呼び出すと正常に動作します。

登録API関数

// POST api/Account 
[AllowAnonymous] 
public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    var user = new ApplicationUser() { UserName = model.UserName, Email = model.Email, Active = true, CreationDate = DateTime.Now }; 

    IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

    if (!result.Succeeded) 
    { 
     return GetErrorResult(result); 
    } 

    return Ok(); 
} 

テスト機能

[TestMethod] 
public void Register_Pass() 
{ 
    // Arrange & Act 
    var db = new WizardSwearsDB(); 

    new DBCleanup().RemoveRegisteredUser(userName); 
    string apiCall = ""; 
    new 
    { 
     UserName = userName, 
     Email = email, 
     Password = password, 
     ConfirmPassword = password 
    }.Post(baseUrl + apiCall); 

    var user = (from u in db.AspNetUsers 
       where u.UserName == userName 
       select u).FirstOrDefault(); 

    // Assert 
    Assert.IsNotNull(user); 
    Assert.AreEqual(userName, user.UserName); 
} 

JSONポスト機能

public static void Post(this object obj, string url, string securityToken = null) 
{ 
    var request = WebRequest.Create(url); 
    obj.Request<string>(url, postJsonRequestBuilder, null, securityToken); 
} 

private static Func<string, object, string, WebRequest> postJsonRequestBuilder = (url, o, st) => jsonRequestBuilder(url, o, "POST", st); 

private static Func<string, object, string, string, WebRequest> jsonRequestBuilder = delegate(string url, object obj, string method, string securityToken) 
{ 
    WebRequest request = WebRequest.Create(url); 
    if (!string.IsNullOrEmpty(securityToken)) request.Headers.Add("Authorization", string.Format("Bearer {0}", securityToken)); 
    request.Method = method; 
    if (obj != null) 
    { 
     request.ContentType = "application/json"; 
     var payload = encoding.GetBytes(JsonConvert.SerializeObject(obj)); 
     request.ContentLength = payload.Length; 
     using (var stream = request.GetRequestStream()) 
     { 
      stream.Write(payload, 0, payload.Length); 
     } 
    } 
    return request; 
}; 

したがって、これらの機能のどれもがまったく変わっていない、と私の推測では、それがのawaitで何かを持っているが、私はちょうどなぜそれを把握することはできません登録済みユーザー関数を削除し、

public void RemoveRegisteredUser(string userName) 
{ 
    // Open up a connection to the database 
    var db = new WizardSwearsDB(); 

    // Get the user from the ASPNetUsers table 
    var dbUserASP = (from b in db.AspNetUsers 
        where b.UserName == userName 
        select b).FirstOrDefault(); 


    // Remove the user from both tables and save changes 
    if (dbUserASP != null) 
    { 
     db.AspNetUsers.Remove(dbUserASP); 
     db.SaveChanges(); 
    } 

    RemoveEmployee(userName); 
} 

public void RemoveEmployee(string userName) 
{ 
    // Open up a connection to the database 
    var db = new WizardSwearsDB(); 

    // Get the user from the ASPNetUsers table 
    var employee = (from b in db.Employees 
        where b.UserName == userName 
        select b).FirstOrDefault(); 

    // Remove the user from both tables and save changes 
    if (employee != null) 
    { 
     db.Employees.Remove(employee); 
     db.SaveChanges(); 
    } 
} 

従業員の機能を削除しますこのように動作しています。

+0

明らかに謝罪することについてお詫び申し上げますが、単体テストを踏むとどうなりますか?あなたはかなり素早くぶら下がっている場所を把握することができます。デバッグモードのクライアントとサーバーの両方を意味します。 – Rake36

+0

ユニットテスト全体を実行しましたが、何もハングしませんでしたが、コール時にサーバ側でハングします。 IdentityResult result = await UserManager.CreateAsync(user、model.Password); – tokyo0709

答えて

1

ただ問題を解決しました。私のコンピュータとVisual Studioとvoilaを完全に再起動しましたか?副次的に、なぜこの問題が解決されたのかよく知っている人はいますか?たぶんVisual Studioのバグですか?

+0

通常は、非同期コードを使用していないため、非同期コードを使用していないため、 'Task .Result'をコールスタックの' await'と混在させています。しかし、それはVSの再起動によって修正されることはありませんでしたので、おそらくあなたはVSのバグを経験しましたか? – Igor

+0

同じ問題が発生しましたが、再起動してもこれまでのところ助けにはなりませんでした。/ 私の場合、デバッグですべてのテストを実行すると、デバッグにハングアップすることさえあります。私はCreateAsyncに足を踏み入れて、それを私の上に置くことができます。 – Sam