使用NUnit和Moq对Web服务会话变量进行单元测试

本文关键字:变量 会话 单元测试 服务 Web NUnit Moq 使用 | 更新日期: 2023-09-27 18:28:14

我想测试一些Web服务(asmx)的WebMethod。假设我有以下代码:

    public IUsersRepository UsersRepository
    {
        get { return Session["repository"] as IUsersRepository; }
        set { Session["repository"] = value; }
    }
    [WebMethod(EnableSession = true)]
    public int AddUser(string userName, int something)
    {
        var usersRepository = Session["repository"] as IUsersRepository;
        return usersRepository.AddUser(userName, something);
    }

以及相应的单元测试(只是测试是否调用了存储库):

    [Test]
    public void add_user_adds_user()
    {
        // Arrange
        var repository = new Mock<IUsersRepository>();
        var service = new ProteinTrackingService { UsersRepository = repository.Object };
        // Act
        var userName = "Tester";
        var something = 42;
        service.AddUser(userName: userName, something: something);
        // Assert
        repository.Verify(r => r.AddUser(
            It.Is<string>(n => n.Equals(userName)),
            It.Is<int>(p => p.Equals(something))));
    }

当我运行此测试时,我收到以下错误消息:

System.InvalidOperationException:HttpContext不可用
此类只能在ASP.NET请求的上下文中使用。

我该怎么做才能使这个测试发挥作用?

使用NUnit和Moq对Web服务会话变量进行单元测试

你看过这个吗?在单元测试中设置HttpContext.Current.Session显然可以模拟会话。

关于你的断言,你可以直接做:

// Assert
    repository.Verify(r => r.AddUser(userName, something));

这将断言您正在使用这些参数调用该方法。

希望这能有所帮助!