簡體   English   中英

如何在我想要使用NUnit測試的方法中模擬方法調用?

[英]How do I mock a method call inside the method I want to test using NUnit?

我正在嘗試對方法進行單元測試並模擬其中的方法調用:

class LoginViewModel
{
public bool LogUserIn(string hashedPassword)
    {
        //Code
        if (loginSuccessful)
        {
            GoToMainMenu(); // I WANT TO MOCK THIS CALL.
            return true;
        }
         return false;
    }
}

所以我想模擬GoToMainMenu()函數調用,因為這只是用於導航,當我嘗試運行我的測試時,我得到一個異常拋出。

我嘗試過使用NUnit.Mocks:

    [Test]
    public void Log_User_In_Will_Return_True()
    {
        DynamicMock mockView = new DynamicMock(typeof(LoginViewModel));
        mockView.ExpectAndReturn("GoToMainMenu", null);
        LoginViewModel loginVM = (LoginViewModel)mockView.MockInstance; //ArgumentException
        Assert.AreEqual(true, loginVM.LogUserIn("aHashedPassword"));
    }

但這給了我一個ArgumentException。

我花了很多時間嘗試不同的方法來完成這項工作,並且還嘗試過Rhino Mocks但是無法理解如何模擬這個調用。 有人能幫忙嗎? 我沒有嘗試過Moq,但懷疑它與Rhino Mocks類似。

在您當前的設置中,您嘗試做的事情是不可能的。 幾件事情無法解決:

  • 開始使用穩定版的Rhino(如3.6)。 更好的是,升級到Moq,這是一個更新的框架
  • 使GoToMainMenu方法virtual (至少protected

那么你的測試(Rhino 3.6)應如下所示:

var mock = MockRepository.GenerateMock<LoginViewModel>();
Assert.AreEqual(true, mock.LogUserIn("aHashedPassword"));

這里有幾點需要注意。 調用的任何非虛方法都將使用您的原始實現(如LogUserIn )。 另一方面,每個虛擬方法都將由具有默認( 不執行任何 )實現的RhinoMocks替換,這應該足以使測試通過。 在Moq進行相同的測試:

var mock = new Mock<LoginViewModel>();
Assert.AreEqual(true, mock.Object.LogUserIn("aHashedPassword"));

它的工作方式(需要有virtual方法)是因為在創建模擬時,Rhino和Moq都會在內存中生成程序集並在那里創建新類型,從你的類型派生(在你的情況下,是LoginViewModel )。 派生類型(模擬)可以替換任何原始類型的方法,因為它是virtual (標准C#機制)或類型是接口 - 然后模擬只是實現接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM