2017-06-01 138 views
2

运行单元测试项目时出现以下问题。无法获得默认构造函数

无法获取默认构造********类

[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 = "[email protected]"; 
     var result = ac.Register(model); 
     Assert.AreEqual("User Registered Successfully", result); 
    } 

如何解决这个问题。一些答案说,使用参数少的构造函数。但在这里我需要params。

RegisterBindingModel()

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

问题Image

+1

Counstructor什么类?你可以显示'RegisterBindingModel'的构造函数吗? –

+1

只需添加一个参数较少的构造函数。测试框架要求我相信。 – Wheels73

+0

您确定需要测试夹具参数的构造函数吗?我相信你可以通过mock获得所有的依赖关系,当然如果你正在进行单元测试 – hmnzr

回答

2

您应该使用像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 = "[email protected]"; 
     var result = ac.Register(model); 
     Assert.AreEqual("User Registered Successfully", result); 
    } 
} 

你可以得到帮助的形式thisthis链接。

+0

您的第一个链接“Moq”转到Socket.Available Property页面。我认为这是不正确的 – Dairo

2

我刚刚在我的单元测试中测试了这个。

添加

public PersonRegistration() 
{ 
} 

它应该运行正常。

您的单元测试类没有必要使用构造函数。如果你正在使用像Moq这样的模拟框架,那么我使用工厂来为我正在测试的类返回相关的moqs。

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 = "[email protected]"; 
    var result = ac.Register(model); 
    Assert.AreEqual("User Registered Successfully", result); 
} 

如果您不使用mock,那么只需在测试中实例化用户和日志服务或创建SetUp。

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

希望有所帮助。