Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FormsAuthenticationTicket用户数据和单元测试_C#_Unit Testing_Forms Authentication_Asp.net Mvc 4 - Fatal编程技术网

C# FormsAuthenticationTicket用户数据和单元测试

C# FormsAuthenticationTicket用户数据和单元测试,c#,unit-testing,forms-authentication,asp.net-mvc-4,C#,Unit Testing,Forms Authentication,Asp.net Mvc 4,我试图在MVC中进行一些单元测试,但是我的一些功能需要一个用户ID才能工作(例如,将其作为外键保存到数据库) 用户ID存储在我的FormsAuthenticationTicket的UserData属性中,我如何在单元测试时“伪造”用户ID,以便可以使用伪造用户运行单元测试。这可能吗 我正在使用微软的内置单元测试系统 我计划使用的测试代码类似于 [TestMethod] public void EnsureAddItemAddsItems() { // Arrange Shopping

我试图在MVC中进行一些单元测试,但是我的一些功能需要一个用户ID才能工作(例如,将其作为外键保存到数据库)

用户ID存储在我的
FormsAuthenticationTicket
UserData
属性中,我如何在单元测试时“伪造”用户ID,以便可以使用伪造用户运行单元测试。这可能吗

我正在使用微软的内置单元测试系统

我计划使用的测试代码类似于

[TestMethod]
public void EnsureAddItemAddsItems()
{
   // Arrange
   ShoppingCartController controller = new ShoppingCartController();
   // These would be populated by dummy values
   Guid itemID = Guid.Empty;
   Guid itemTypeID = Guid.Empty;

   // Act
   ViewResult result = controller.AddItem(itemTypeID, itemID);

   //Assert
   Assert.AreEqual("Your shopping cart contains 1 item(s)",result.ViewBag.Message);
}
一些示例代码可能如下所示:-

public ActionResult AddItem(Guid itemType, Guid itemID, string returnAction)
{
    ShoppingCartViewModel oModel = new ShoppingCartViewModel();

    string szName = String.Empty;
    int price = 0;


    using (var context = new entityModel())
    {
        // This is the section I'm worries about
>>>>>>>>> Guid gUserID = this.GetCurrentUserID(); <<<<<<<<<

        var currentSession = this.CreateOrContinueCurrentCartSession(gUserID);

        var oItem = new ShoppingCartItem();
        oItem.Id = Guid.NewGuid();
        oItem.ItemId = itemID;
        oItem.ItemTypeId = itemType;
        oItem.ItemName = szName;
        oItem.ShoppingCartSessionId = currentSession.ID;
        oItem.Price = 1;
        context.ShoppingCartItems.AddObject(oItem);
        context.SaveChanges();
    }

    this.FlashInfo("Item added to shopping cart");
    ViewBag.Message(string.Format("Your shopping cart contains {0} item(s)",AnotherFunctionThatJustCountsTheValues()));
    return this.View();

}
公共操作结果附加项(Guid项类型、Guid项ID、字符串返回操作) { ShoppingCartViewModel oModel=新的ShoppingCartViewModel(); string szName=string.Empty; 国际价格=0; 使用(var context=new entityModel()) { //这是我担心的部分 >>>>>>>>>Guid gUserID=this.GetCurrentUserID(); //这是我担心的部分
Guid gUserID=This.GetCurrentUserID();

这是因为通常情况下,此部分与控制器操作无关。因此,让我们删除它,好吗?这样,您就不再需要担心:-)

<>让我们先简化你的代码,因为它包含太多的噪音。顺便说一下,你应该考虑,因为它太复杂,太多的事情。 关键部分是:

[Authorize]
public ActionResult AddItem()
{
    Guid gUserID = this.GetCurrentUserID();
    return Content(gUserID.ToString());
}
现在,这确实令人恼火,因为如果
GetCurrentUserID
方法驻留在您的控制器中,并尝试读取表单身份验证cookie,您可能会遇到单独进行单元测试的问题

如果我们的代码如下所示,该怎么办:

[MyAuthorize]
public ActionResult AddItem()
{
    var user = (MyUser)User;
    return Content(user.Id.ToString());
}
其中,
MyUser
是自定义主体:

public class MyUser : GenericPrincipal
{
    public MyUser(IIdentity identity, string[] roles) : base(identity, roles)
    { }

    public Guid Id { get; set; }
}
这不是很好吗?这样控制器的动作就不用再担心饼干、门票和其他东西了。这不是它的责任

现在让我们看看如何对其进行单元测试。我们选择我们最喜欢的模拟框架(在我的例子中是与之一起)和模拟:

[TestMethod]
public void AddItem_Returns_A_Content_Result_With_The_Current_User_Id()
{
    // arrange
    var sut = new HomeController();
    var cb = new TestControllerBuilder();
    cb.InitializeController(sut);
    var user = new MyUser(new GenericIdentity("john"), null)
    {
        Id = Guid.NewGuid(),
    };
    cb.HttpContext.User = user;

    // act
    var actual = sut.AddItem();

    // assert
    actual
        .AssertResultIs<ContentResult>()
        .Content
        .Equals(user.Id.ToString());
}
自定义授权属性负责读取表单身份验证cookie的UserData部分,并将当前主体设置为自定义主体

//这是我担心的部分
Guid gUserID=This.GetCurrentUserID();

这是因为通常情况下,此部分与控制器操作无关。因此,让我们删除它,好吗?这样,您就不再需要担心:-)

<>让我们先简化你的代码,因为它包含太多的噪音。顺便说一下,你应该考虑,因为它太复杂,太多的事情。 关键部分是:

[Authorize]
public ActionResult AddItem()
{
    Guid gUserID = this.GetCurrentUserID();
    return Content(gUserID.ToString());
}
现在,这确实令人恼火,因为如果
GetCurrentUserID
方法驻留在您的控制器中,并尝试读取表单身份验证cookie,您可能会遇到单独进行单元测试的问题

如果我们的代码如下所示,该怎么办:

[MyAuthorize]
public ActionResult AddItem()
{
    var user = (MyUser)User;
    return Content(user.Id.ToString());
}
其中,
MyUser
是自定义主体:

public class MyUser : GenericPrincipal
{
    public MyUser(IIdentity identity, string[] roles) : base(identity, roles)
    { }

    public Guid Id { get; set; }
}
这不是很好吗?这样控制器的动作就不用再担心饼干、门票和其他东西了。这不是它的责任

现在让我们看看如何对其进行单元测试。我们选择我们最喜欢的模拟框架(在我的例子中是与之一起)和模拟:

[TestMethod]
public void AddItem_Returns_A_Content_Result_With_The_Current_User_Id()
{
    // arrange
    var sut = new HomeController();
    var cb = new TestControllerBuilder();
    cb.InitializeController(sut);
    var user = new MyUser(new GenericIdentity("john"), null)
    {
        Id = Guid.NewGuid(),
    };
    cb.HttpContext.User = user;

    // act
    var actual = sut.AddItem();

    // assert
    actual
        .AssertResultIs<ContentResult>()
        .Content
        .Equals(user.Id.ToString());
}

自定义授权属性负责读取表单身份验证cookie的UserData部分,并将当前主体设置为自定义主体。

您是在谈论控制器操作吗?您需要测试哪些函数?能否为要进行单元测试的方法显示一个示例代码?您是如何实现的是否正在阅读此用户ID?@Darin我刚刚开始编写单元测试,还没有任何代码要测试,只是开始了一个新项目,并希望从一开始就进行良好的实践。其中的一个示例可能是“测试以确保在将某个项目添加到购物车时,该项目会保存到该用户的购物车会话中”您打算如何实现您描述的场景?它与FormsAuthenticationCookie的UserData部分有什么关系?如果不知道您打算编写什么代码,编写单元测试将非常困难。它可能是一个伪代码,但您需要一个框架。给我10分钟,我将编写一段示例代码要显示。@DarinDimitrov添加了示例代码。您是在谈论控制器操作吗?您需要测试哪些函数?您可以为要进行单元测试的方法显示一个示例代码吗?您当前如何读取此用户ID?@Darin我刚开始编写单元测试,还没有真正需要测试的代码,只是开始一个新项目,希望从一开始就进行良好的实践。其中的一个示例可能是“测试以确保在将项目添加到购物车时,该项目会保存到该用户的购物车会话中”您打算如何实现您描述的场景?它与FormsAuthenticationCookie的UserData部分有什么关系?如果不知道您打算编写什么代码,编写单元测试将非常困难。它可能是一个伪代码,但您需要一个框架。给我10分钟,我将编写一段示例代码为了展示。@DarinDimitrov添加了示例代码非常感谢:)比我想要的多得多,但给了我一个更清晰的如何改进代码的想法。希望有一种方法可以给“奖金”投票!非常感谢:)比我想要的多得多,但给了我一个更清晰的如何改进代码的想法。希望有一种方法可以给“奖金”投票!