【问题标题】:MOQ how to mock a class that depends on another classMOQ 如何模拟一个依赖于另一个类的类
【发布时间】:2025-12-14 02:10:01
【问题描述】:

我有一个类的构造函数如下:

public class SsoAuthenticationService : ISsoAuthenticationService
{
  public SsoAuthenticationService(ILoginManager manager)
    {
        _manager = manager;
    }
}

管理器类也有这样的构造函数:

 public class LoginManager:ILoginManager
 {
    private ILoginRepository login;

    public LoginManager(ILoginRepository loginRepository)
    {
        login = loginRepository;
    }
  }

我正在尝试针对 SSoAuthenticationService 类编写单元测试

    public void CreateLogin_Returns_Login()
    {
        //arrange
        var mocManager = new Mock<ILoginManager>();

        ILoginManager m = mocManager.Object;

        //fails at the next line
        var svc = new SsoAuthenticationService(mocManager.Object);
        var request = new CreateSsoLoginRequest()
                          {
                              EmailAddress = "",
                              Password = "",
                              SecurityQuestionAnswer = "",
                              SecurityQuestionId = 0,
                              SiteIdentifier = "",
                              Username = ""
                          };

        //act
        var response = svc.CreateSsoLogin(request);

        //assert
        response.Should().NotBeNull();
    }

当它尝试实例化 SsoAuthenticationService 类 ("Value cannot be null.\r\nParameter name: value") 时会出错,我认为问题在于我还需要模拟 IRepository 类,但我不确定模拟代码应该是什么样子。

编辑:完整的异常信息

“Progressive.Sso.WebServices.SsoAuthenticationService”的类型初始化程序引发了异常。
值不能为空。\r\n参数名称: 值
在 Progressive.Sso.WebServices.SsoAuthenticationService..ctor(ILoginManager 管理器)
在 Progressive.Sso.Tests.Service_Methods.ServiceTest.CreateLogin_Returns_Login() in d:\tfs\sso\Dev\Dev\Src\SSO Web Services\Progressive.Sso.Tests\Service Methods\ServiceTest.cs:line 29

谁能帮帮我?

【问题讨论】:

  • 您能否提供完整的异常信息,如堆栈跟踪。另外 CreateSsoLogin 对ILoginManager 做了什么?
  • 调用 CreateSsoLogin 没有达到,实例化 SsoAuthenticationService 时代码失败
  • 你有上面没有显示的静态字段吗?
  • 非常有预见性 - aqwert,在我发布答案后才注意到您的评论。静态方法是问题所在。

标签: c# unit-testing moq


【解决方案1】:

我找到了解决方案,问题与起订量无关,也与构造函数依赖无关。

我声明了以下两个成员变量

private static readonly bool _useOperationTimer = SsoConfig.UseServiceOperationTimer;
private static readonly bool _logRequestData = SsoConfig.LogRequestData;

静态方法调用是问题的原因,如果它们被注释掉一切正常。

【讨论】:

    最近更新 更多