【问题标题】:Unable to get Default Constructor无法获取默认构造函数
【发布时间】:2017-11-02 04:58:27
【问题描述】:

我在运行单元测试项目时遇到以下问题。

无法获取类 ******** 的默认构造函数

[TestClass]
public class PersonRegistration
{
    private ILoggingService _loggingService;
    private IUserManager _userManager;
    public PersonRegistration(IUserManager userManager, ILoggingService loggingService)
    {
        this._userManager = userManager;
        this._loggingService = loggingService;
    }
    [TestMethod]
    public void TestMethod1()
    {
        RegisterBindingModel model = new RegisterBindingModel();
        AccountController ac = new AccountController(_userManager, _loggingService);
        model.UserName = "test123@gmail.com";
        var result = ac.Register(model);
        Assert.AreEqual("User Registered Successfully", result);
    }

如何解决。一些答案说使用无参数构造函数。但是这里我需要参数。

RegisterBindingModel()

public class RegisterBindingModel
{
    public RegisterBindingModel();
    [Display(Name = "User name")]
    [Required]
    public string UserName { get; set; }
}

问题

【问题讨论】:

  • 什么课程的辅导员?你能显示RegisterBindingModel的构造函数吗?
  • 只需添加一个无参数构造函数。我相信测试框架需要它。
  • 您确定需要带有测试夹具参数的构造函数吗?我相信你可以通过模拟获得所有依赖项,当然如果你进行单元测试
  • 那么,测试运行程序是如何知道如何从其中变出IUserManagerILoggingService 实例的?

标签: c# asp.net asp.net-mvc constructor default-constructor


【解决方案1】:

您应该使用类似Moq 的模拟框架。

例子:

[TestClass]
public class PersonRegistration
{

    [TestMethod]
    public void TestMethod()
    {
        RegisterBindingModel model = new RegisterBindingModel();

        var mockService = new Mock<ILoggingService>();//Mock
   //Do something as per your requirement 
   //var reg= new List<RegisterBindingModel >(); // provide some sample list 
    //mockService .Setup(r => r.GetAll=()).Return(reg);

        var mockManager = new Mock<IUserManager>();//Mock

    //Do something as per your requirement 
    //var user= new List<User>(); // provide some sample list 
    //mockManager .Setup(r => r.GetAll=()).Return(user);

        AccountController ac = new AccountController(mockManager.Object, mockService.Object);
        model.UserName = "test123@gmail.com";
        var result = ac.Register(model);
        Assert.AreEqual("User Registered Successfully", result);
    }
}

您可以通过thisthis 链接获得帮助。

【讨论】:

  • 您的第一个链接“Moq”转到 Socket.Available 属性页面。我认为这是不正确的
【解决方案2】:

我刚刚在单元测试中对此进行了测试。

添加

public PersonRegistration()
{
}

它应该运行良好。

单元测试类不需要构造函数。如果您使用像 Moq 这样的模拟框架,那么我使用工厂来返回我正在测试的类的依赖 moq。

 public ILoggingService ReturnMockLoggingService()
 {
       var mockService = new Mock<ILoggingService>();
       return mockService.Object;
 }

然后在测试夹具中。

[TestMethod]
public void TestMethod1()
{
    RegisterBindingModel model = new RegisterBindingModel();

    var logService = MockFactory.ReturnMockLoggingService();
    var userService = MockFactory.ReturnMockUserService();
    AccountController ac = new AccountController(userService, logService);

    model.UserName = "test123@gmail.com";
    var result = ac.Register(model);
    Assert.AreEqual("User Registered Successfully", result);
}

如果您不使用模拟,那么只需在测试中实例化用户和日志服务或创建一个设置。

[ClassInitialize]
public void SetUp()
{
    _loggingService = new LoggingService();
    _userManager = new UserManager();
}

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-02
    • 2016-07-23
    • 2023-03-20
    • 1970-01-01
    • 2010-10-30
    • 2014-05-15
    • 2011-03-12
    • 2018-04-23
    相关资源
    最近更新 更多