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.
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
@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
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