2014-05-01 22 views
24

Test edilen nesneyi doldurmak için bazı birim testleri ve Rhino Mocks kullanarak ayarlıyorum. Alay edilmekte olan şeylerden biri, Task<HttpResponseMessage>'dur, çünkü test edilmekte olan mantık, bir async yanıtı almak için bir HttpClient numaralı telefona bir çağrı içermektedir. Bu yüzden bu gibi mocks kurma başladımGörev Nasıl Atanır <> Sonuç?

:

var httpClient = MockRepository.GenerateMock<HttpClient>(); 
var taskFunc = MockRepository.GenerateMock<Func<HttpResponseMessage>>(); 
var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc); 
var response = MockRepository.GenerateMock<HttpResponseMessage>(); 

httpClient.Stub(c => c.PostAsJsonAsync<IEnumerable<LogMessage>>(Arg<string>.Is.Anything, Arg<IEnumerable<LogMessage>>.Is.Anything)).Return(responseTask); 
responseTask.Stub(t => t.Result).Return(response); 
response.Stub(r => r.IsSuccessStatusCode).Return(true); 

(, test edilen testin adım nesne örneğini oluşturmak için olacak "hareket" it httpClient beslemek ve bir yöntemi çalıştırmak . üzerinde yöntem çağrıları üzerlerinde yapılan beklenen mocks aracılığıyla doğrular "iddia")

bir ayıklayıcısında bu adım atma, belirsiz bu hat asmak var.

responseTask.Stub(t => t.Result).Return(response); 

Rhino Mocks veya C# async ile çok fazla tecrübem yok, bu yüzden bariz bir şeye bakabilirim. Amaç, elbette, .Result özelliğine yapılan herhangi bir çağrının response sahte olduğunu döndürmesidir. Ama benim girişimin kendisi belki de bir alay olduğu için süresiz beklemeyi beklediğim .Result'u çağırıyor gibi görünüyor.

Bunu düzenlemenin doğru yolu nedir? Aslında, nesneyi alaylı bir HttpClient ile sağlamalı ve belirli bir argümanla üzerinde bir yöntemin çağrıldığını ileri sürmeliyim.

+1

Bir yıl veya daha önce MOQ kullanarak Görevler çevresinde çok uğraştım. Yanlış olmadıkça, sadece mock responseTask'ınıza geçirdiğiniz taskFunc'i değiştirmeniz gerekir. Daha sonra bu sahte fonksiyonun hemen bir cevap vermesini sağlayın. – Keith

+0

@Keith: İlginç. Öyleyse, sadece bir geri dönüş yerine, gerçek bir Func 'oluşturmalısınız. Ben sadece şöyle denedim: 'Func taskFunc = delege() {return response; }; 've bu' taskFunc'ı 'responseTask' alayına geçirdi, ancak aynı davranış gözlendi. – David

+1

Gerçek bir Mock Görevine ihtiyacınız olduğunu düşünmüyorum. Mock için ihtiyacınız olan şey, Task'a geçen işlevdir, bu yüzden sadece "x" i döndürecektir. – Keith

cevap

37

basit şey beklenen sonuçla tamamlanmış bir görevi dönmek adildir:

var responseTask = Task.FromResult(response); 

Bu alay görev başlamış asla ve dolayısıyla verilen fonk çalışmaz olmasıdır asılı nedeni düşünün. Eğer test bunu başlayabileceğini:

var responseTask = MockRepository.GenerateMock<Task<HttpResponseMessage>>(taskFunc); 
responseTask.Start(); 

Ancak kolayca doğrudan görevleri/başarısız/tamamlandı iptal oluşturabilirsiniz beri görevlerini alay etmek hiçbir neden yok.

+0

Bu hile yapıyor gibi görünüyor. Bununla, ikinci iki Stub() çağrısıyla da kaldırmam gerekiyordu. ('.Result' cevabınız tarafından ele alınmıştır,' .IsSuccessStatusCode' saplama denemeye çalışırken bir hata atıyordu ama yine de gerçekte sahte 'gerçek' gibi görünüyor.) Teşekkürler! – David

+0

Teşekkürler, bu da bana yardımcı oldu! – Aaron