簡體   English   中英

分配給控制器后,moq對象變為空

[英]moq object becomes null after assignment to controller

我正在為MVC5控制器方法構建測試。 我正在使用最小起訂量進行測試。 我感興趣的是如何測試需要身份驗證的控制器方法,並使用userid值而不是username值來決定向瀏覽器/客戶端顯示哪些數據。

根據我到目前為止的研究,可以使用大量代碼來添加用戶名,但沒有太多用於userid值的代碼(在我的情況下,它看起來像一個Guid)。 我正在使用ASP.Net Identity作為帳戶管理。 我還為Google和Facebook登錄添加了OWIN。

我正在使用依賴項注入(使用Unity),因為這似乎是完成測試的唯一方法,而且DI允許使用moq。

這是從控制器方法中尋找“ NotNull”返回值的測試方法示例:

Mock<ModelObject> CreateModelObjectFromHelper()
{
    var ci = new Mock<ClaimsIdentity>();
    var myHelper = new Mock<MyHelper>();
    myHelper.Setup(x => x.GetCurrentUserId(ci.Object)).Returns("333c188b-b33a-4233-83bd-5ea3a3333333");
    return new Mock<ModelObject>(myHelper.Object);
}


[TestMethod]
public async Task ExampleController_Method_NotNull()
{
    Mock<ModelObject> o = CreateModelObjectFromHelper();
    ExampleController controller = new ExampleController(o.Object as IModelObject);
    ViewResult result = await controller.MethodName() as ViewResult;
    //check for non null result
    Assert.IsNotNull(result);
}

我使用以下代碼在GetCurrentUserId方法中查詢Userid的Userid:

var userIdClaim = user.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);
userIdValue = userIdClaim.Value.ToString();

據說該方法已被最小起訂量代替。 GetCurrentUserId方法是幫助程序類(MyHelper)中的虛擬方法,該類是模型對象(ModelObject)的構造函數的參數,該模型對象是控制器(ExampleController)的構造函數的參數。

在測試方法的調試器(Visual Studio 2013)中,發生的事情是在CreateModelObjectFromHelper方法中創建了對象,但是在以下行創建了ExampleController時:

ExampleController controller = new ExampleController(o.Object as IModelObject);

MyHelper的最小對象將為null。 我可以看到該對象在此語句之前具有值,但是在此語句中,MyHelper對象變為null ...並且整個測試失敗。 我認為它會失敗,因為很難在null對象上調用方法。

問題是...是什么導致該對象變為空?

另一個問題是……也許有更好的方法可以做到這一點,如果可以,我很高興聽到一個建議。

謝謝

它不是那樣工作的。 您嘗試創建模擬的模擬...

如果您的控制器僅依賴IModelObject,則僅創建Mock並設置其屬性/方法以返回您在控制器中所需的內容。

如果沒有IModelObject的代碼以及如何在控制器中使用它,很難提供更好的示例。

暫無
暫無

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

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