2015-10-20 22 views
5

Her birim testlerimde oturum açmış bir kullanıcı olması gerekir, bu da beni SetUp testimdeki bir async çağrısı yapmak için zorluyor.Async UnitTests kurulumu C#

Bu işi yapmanın bir yolunu bulamıyorum, ya boş gösterici istisnaları veya kurulum için geçersiz imzalar alıyorum.

public async void SetUp() {} 

Bu benim oturum değilim çünkü tüm benim test muhtemelen benim nesnelerle başarısız kılar.

public async Task SetUp() {} 

kurulum geçersiz imzası olduğu için göz ardı tüm testini yapar.

Ve her bir testte X serilerimi kopyalamak zorunda kalmak istemiyorum çünkü hepsi tamamen aynı ve kurulumun ne demek olduğu.

Neyi eksik? Bu önemsiz bir problem gibi görünüyor. İşte

Sadece senin SetUp yöntemi hiç zaman uyumsuz ve bu yazmayın gelemedi şey

CreateTicketViewModel _viewModel; 

     [SetUp()] 
     public async void SetUp() //I have tried using Task instead of void 
     { 

      IUserService userService = Dependency.Instance.Resolve<IUserService>(); 
      await userService.LoginAsync(this.UserName, this.Password); 

      _viewModel = Dependency.Instance.Resolve<CreateTicketViewModel>(); 
     } 

     [TearDown()] 
     public void TearDown() 
     { 
      _viewModel = null; // I have tried removing this 
     } 

     [Test()] 
     public void Initialization() 
     { 
      // If I put what's in SetUp here and add "async" before void, 
      // it works just fine 

      Assert.IsNotNull(_viewModel); 
      Assert.IsNotNull(_viewModel.Ticket); 
     } 
+0

Sahip olmadığım SUT'de async void olmamasıyla ilgili pek çok blog yazısı okudum, ancak bu blog yazılarının hiçbiri sınama hakkında konuşmuyor. Tasarım problemim var mı? –

+0

Test yöntemlerinizi, Kurulum yöntemi yerine uyumsuz hale getiremiyor musunuz? Ya da SetUp yöntemini senkronize bile yapabilirsiniz. Eskiden olsa önerilir. –

+0

Sadece asscel içeren bir async testi bir uyarı gösterir. Mümkünse bundan kaçınmayı umuyorum. –

cevap

4

birim test çerçevesi bağlı olarak async kurulum framework tarafından doğru bir şekilde ele olmayabilir kullanırlar. NUnits durumundaki

Henüz uyumsuz Kur kurulum yöntemleri olduğunu düşünüyorum. Eğer Kur'da yapmalıyım Peki

sadece tamamlamak için Giriş için eşzamanlı beklemektir:

userService.LoginAsync(this.UserName, this.Password).Wait();

DÜZENLEME: Bu aynı zamanda MSTests için durum açık bir konu https://github.com/nunit/nunit/issues/60

gibi görünüyor.

2

gösteren uğruna, şimdi ne var?

new Task(() => userService.LoginAsync(this.UserName, this.Password)).RunSynchronously() 
+0

Bunu yaptığımda, test başladığında kullanıcıService içeriğim boştur ve bu nedenle başarısız olur. Bu LoginAsync yönteminin arkasında daha fazla uyumsuz çağrı olduğunu unutmayın. –

+0

oturum açma eşzamanlı olarak –

2

Async Kurulumları desteklenmez, ancak uyumsuz test yöntemleri desteklenir. Test yöntemlerinizi kurulum yöntemi yerine uyumsuz hale getirebilirsiniz.

[TestFixture] 
public class AsyncSetupTest 
{ 
    private Task<CreateTicketViewModel> viewModelTask; 

    [SetUp()] 
    public void SetUp() 
    { 
     viewModelTask = Task.Run(async() => 
     { 
      IUserService userService = Dependency.Instance.Resolve<IUserService>(); 
      await userService.LoginAsync(this.UserName, this.Password); 

      return Dependency.Instance.Resolve<CreateTicketViewModel>(); 
     }); 
    } 

    [Test()] 
    public async Task Initialization() 
    { 
     CreateTicketViewModel viewModel = await viewModelTask; 

     Assert.IsNotNull(viewModel); 
     Assert.IsNotNull(viewModel.Ticket); 
    } 
} 

Fikir yerine Setup yöntemle yapılan tüm kurulum çalışmaları alma, biz kurulumun tamamlanmasını temsil ve Test yönteminde bunu bekleyen bir Task oluşturmak olduğunu.

Bu şekilde, tüm kurulum mantığını tekrarlamıyorsunuz. Ancak tüm test yöntemlerinde ViewModel'i Task'dan ayıklamanız yeterli.

+0

'u çalıştırma fikrini beğenirim ancak bu yine de her testte tekrarlanan tek bir satırın olmasını gerektirirdi; ama aslında yaptığımdan daha iyi. Teşekkür ederim. Diğer taraftan Dan Dinu'nun yanıtı, benim testlerimde yalnızca benim değerlerimi alma becerisiyle "olduğu gibi" çalışan bir çözüm sunmakta, bu da benim kurulumumda daha az kod ve daha küçük bir kod bloğu bulunması anlamına gelmektedir. –

+0

@Zil Bu işe yarayacaktı. Ancak uyumsuz kodda engelleme asla iyi bir fikir değildir. [Bir kilitlenme alabilirsiniz] (http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html). [Ayrıca buna bakın] (http://blogs.msdn.com/b/pfxteam/archive/2011/01/13/10115163.aspx). –

+0

Üretim kodunu kabul ediyorum, ancak giriş işlemi devam ederken testlerin burada beklemesini istiyorum. Bu özel senaryoda bu kadar kötü olduğunu mu düşünüyorsun? Başka bir eşzamanlılık yapmama bildiğimi bilmek (girişin kendisinin yerine) –