Bir yönteme aktarılan değer döndürme


390

Bir arabirimde bir yöntem var:

string DoSomething(string whatever);

Ben MOQ ile alay etmek istiyorum, böylece geçti ne olursa olsun döner - gibi bir şey:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

Herhangi bir fikir?

Yanıtlar:


526

Giriş parametresine sahip bir lambda kullanabilirsiniz, örneğin:

.Returns((string myval) => { return myval; });

Veya biraz daha okunabilir:

.Returns<string>(x => x);

1
Oldukça kolay bir yöntem için yapmanız gerekir dek görünüyor 7 argümanlar ... Ben teftiş IReturnsAdedi, tanımladığı Returnsiçin en fazla 4 argüman . Bunu aşmanın kolay bir yolu var mı? / I değiştirerek hariç ortalama Moq kaynak /
mizuki nakeshu

14
Tamam, bu kadar için tanımlanmış 9 argümanlar içinde Moqv 4.0.0.0. çözüldü :)
mizuki nakeshu

14
@mizukinakeshu Sınıf / yöntem çok şey yapıyor gibi göründüğü için 9 argüman yönteminde bir refactor biraz düşünecektim. Belki de 9 parametreyi daha sonra size yardımcı olacak bir ayar sınıfına veya yapıya dönüştürün.
Senatör

@ TheSenator Katılıyorum, zaten bunun ne hakkında olduğunu hatırlamıyorum ama sanırım ben sadece değiştirmek için değil zaten mevcut kod için bazı birim testleri kesmek oldu, aksi takdirde bu argüman sayısı kesinlikle yeniden düzenleme için çağırır.
mizuki nakeshu

27
Bu sadece beni karıştırdığı için bir not: içindeki dize .Returns<string>, döndürdüğünüz değerleri değil, girdi parametrelerini ifade eder.
Jim

241

Daha da kullanışlı, birden fazla parametreniz varsa bunlardan herhangi birine / tümüne erişebilirsiniz:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

Yalnızca bir tanesini kullanacak olsanız bile, yöntemin imzasını eşleştirmek için her zaman tüm bağımsız değişkenlere başvurmanız gerekir.


17
Bu kabul edilen cevap olmalı. Bu tam olarak yapmanız gereken şey. Başka her şey "beklenen sayıda argüman" istisnası atar.
Chaim Eliyah

Evet, kesinlikle daha kolay okunur ve birlikte çalışır ReturnsAsync!
Piotr Kula

1
Bu cevap günü kurtardı. Not (gelecekteki okuyucular), biraz daha ileri gidebilirsiniz. .Returns ((dize a, dize b, dize c) => {dize d = "vay"; dönüş dizesi. Concat (a, b, c, d);});
granadaCoder

1
Şahsen, bu çok daha iyi bir cevap. Moq hakkında çok az bilgim var ama yine de hemen anladım.
unrealsoul007

Void döndüren yöntemler için .Callback ((string a, Exception b, string c) => yeni Exception (b.Message) atın;
timtam

62

Genel Returns<T>yöntem bu durumu güzel bir şekilde ele alabilir.

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

Veya yöntem birden çok girdi gerektiriyorsa, bunları şu şekilde belirtin:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.