Soru Sadece bazı yöntemleri alay etmek için moq kullanma


Aşağıdaki yönteme sahibim:

public CustomObect MyMethod()
{
    var lUser = GetCurrentUser();
    if (lUser.HaveAccess)
    {
        //One behavior
    }
    else 
    {
        //Other behavior
    }

    //return CustomObject
}

Ben alay etmek istiyorum IMyInterface.GetCurrentUser, böylece arama yaparken MyMethod Kontrol etmek için kod yollarından birine ulaşabilirim. Bunu Moq ile nasıl yapabilirim?

Ben şu şeyi yapıyorum:

var moq = new Mock<IMyInterface>();            
moq.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);

//act
var lResult = moq.Object.MyMethod();

Ama nedense lResult her zaman null ve içine girmeye çalışırken MyMethod hata ayıklamasında daima bir sonraki ifadeye geçiyorum.


44
2018-01-22 19:06


Menşei


Neredesin lUnauthorizedUser başlatıldı? Senin gibi bir şey isteyeceğini düşünürdüm moq.Setup(x => x.GetCurrentUser()).Returns(new User() { HaveAccess = false }); - Tyler Treat
Tyler, tabi ki benm setting it in the above code, just didnKodu kısa tutmak için yapıştırın. - Yaroslav Yakovlev


Cevaplar:


Buna kısmi bir alay denir ve bunu moq'da bildiğim şekilde arabirimden ziyade sınıf alay etmeyi ve ardından ailedeki nesne üzerindeki "Callbase" özelliğini "true" olarak ayarlamanızı gerektirir.

Bu, sanal olarak test ettiğiniz sınıfa ait tüm yöntemleri ve özellikleri yapmayı gerektirir. Bunun bir sorun olmadığını varsayarak, böyle bir test yazabilirsiniz:

 var mock = new Mock<YourTestClass>();
 mock.CallBase = true;
 mock.Setup(x => x.GetCurrentUser()).Returns(lUnauthorizedUser);
 mockedTest.Object.MyMethod();

92
2018-01-22 23:06



Korku veren! Çok teşekkürlert think itbu kadar basit. - Yaroslav Yakovlev
Bir çekicilik gibi çalış! - Sarawut Positwinyu
Benzer cevaplar gördüm, ancak belirttiği için bahsetmeyi unuttular CallBase doğru, veeerrrry gerekli kısmı, teşekkürler! - Mike de Klerk


Genişleyen Lee'nin cevabı,

Sınıfınızdaki tüm yöntemleri ve özellikleri sanal olarak yapmaya gerek yoktur, sadece alay etmek istediğiniz şeyler.

Ayrıca, sınıfınızın somut uygulamasında alay etmeniz gerektiği de unutulmamalıdır.

var mock = new Mock<YourTestClass>(); // vs. var mock = new Mock<IYourTestInterface>();

Sınıfınızda varsayılan bir kurucu yoksa, bunun üzerinden geçmek için argümanlar belirtmeniz gerekir:

var mock = new Mock<YourTestClass>(x, y, z);
// or
var mock = new Mock<YourTestClass>(MockBehavior.Default, x, y, z);

Nerede x, y, z sırasıyla kurucunuzun ilk, ikinci ve üçüncü parametreleridir.

Son olarak, alay etmek istediğiniz yöntem korunursa, eklemeniz gerekir. Moq.Protected

using Moq.Protected;

TReturnType returnValue = default(TReturnType);

mock.Protected()
    .Setup<TReturnType>("YourMockMethodName", It.IsAny<int>()) // methodname followed by arguments
    .Returns(returnValue);

16
2018-05-16 14:15



Kullanabileceğin dikkat çekicidir. nameof(YourTestClass.YourMockMethodName) "YourMockMethodName" yerine. Bu sebepten dolayı metot adı testi tekrar test edeceğiniz zaman çalışmaya devam edecektir. - Shoter


Benzer bir davam vardı. Aşağıdaki kodun, bir arabirimin belirli bir uygulamasından alay edilmiş yöntemleri ve gerçek yöntemleri kullanmam için daha fazla esneklik sağladığını buldum:

var mock = new Mock<ITestClass>(); // Create Mock of interface

// Create instance of ITestClass implementation you want to use
var inst = new ActualTestClass();

// Setup to call method of an actual instance
// if method returns void use mock.Setup(...).Callback(...)
mock.Setup(m => m.SomeMethod(It.IsAny<int>())
    .Returns((int x) => inst.SomeMethod(x));

Artık gerçek yöntemi kullanabilir, ancak kaç kez çağrıldığını görmek için Verify gibi şeyler de kullanabilirsiniz.


10
2018-06-21 18:51



Bu Bay .... etrafında ilginç bir çalışma: D - ppumkin
Bu gerçekten ilginç bir çalışma, sınıf yöntemini sanallaştırmadan aynı şeyi başarabiliriz. - Harshad Vekariya
NULL döndüren yöntemler nasıl olur? Sahte nesne üzerinde İade çağrısı olmayacak? mock.Setup (m => m.SomeMethod (It.IsAny <int> ()) .Returns ((int x) => inst.SomeMethod (x)); - Bendram