Unity、Moq 和 NUnit - 测试中无法识别参数的控制器构造函数
Unity, Moq, and NUnit - Controller Constructor with Parameters Not Recognized in Tests
我是单元测试的新手,如果这不是一个很好的问题,我深表歉意。
我有一个主 Web 项目和一个附带的 NUnit 测试库。我正在使用 Unity 将接口注入到主项目中的控制器中。例如:
public class EquipmentController : Controller
{
private readonly ILocationRepository locationContext = null;
private readonly IRepository<EquipmentCategory> categoryContext = null;
private readonly IEquipmentRepository equipmentContext = null;
private readonly IRecordRepository recordContext = null;
public EquipmentController(ILocationRepository locationRepo, IRepository<EquipmentCategory> categoryRepo, IEquipmentRepository equipmentRepo, IRecordRepository recordRepo)
{
this.locationContext = locationRepo;
this.categoryContext = categoryRepo;
this.equipmentContext = equipmentRepo;
this.recordContext = recordRepo;
}
Web 应用程序本身确实按预期运行。但是,我在尝试编写测试用例时遇到了问题。例如,在测试库中,我有以下内容:
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity.Mvc;
using Microsoft.Practices.Unity.ObjectBuilder;
using Microsoft.Practices.Unity.StaticFactory;
using Moq;
using ITEquipmentDatabase;
using ITEquipmentDatabase.Models;
using ITEquipmentDatabase.Controllers;
namespace ITEquipmentDatabase.Tests
{
[TestFixture]
public class EquipmentController
{
[Test]
public void TestMethod()
{
var equipRepo = new Mock<IEquipmentRepository>();
var categoryRepo = new Mock<IRepository<EquipmentCategory>>();
var locationRepo = new Mock<ILocationRepository>();
var recordRepo = new Mock<IRecordRepository>();
EquipmentController controller = new EquipmentController(locationRepo.Object, categoryRepo.Object, equipRepo.Object, recordRepo.Object);
}
}
}
但是,我收到以下错误:
Error 1 'ITEquipmentDatabase.Tests.EquipmentController' does not contain a constructor that takes 4 arguments C:\Users\Khandokar\Documents\Visual Studio 2013\Projects\IT Equipment Log\ITEquipmentDatabase.Tests\EquipmentController.cs 27 46 ITEquipmentDatabase.Tests
我在我的测试项目中引用了 Unity,甚至添加了 Bootstrapper.cs(不确定是否有必要,但我试图解决上述问题)。我很确定我做错了什么,但我才刚刚开始冒险进行单元测试并且遇到了一些困难。
感谢任何建议。
您的测试 class 被命名为 EquipmentController
,您的 class 被测试也是如此。
将您的测试 class 重命名为 EquipmentControllerTests
或类似名称。
(错误消息是线索;注意它指的是 Tests.EquipmentController
)。
我是单元测试的新手,如果这不是一个很好的问题,我深表歉意。
我有一个主 Web 项目和一个附带的 NUnit 测试库。我正在使用 Unity 将接口注入到主项目中的控制器中。例如:
public class EquipmentController : Controller
{
private readonly ILocationRepository locationContext = null;
private readonly IRepository<EquipmentCategory> categoryContext = null;
private readonly IEquipmentRepository equipmentContext = null;
private readonly IRecordRepository recordContext = null;
public EquipmentController(ILocationRepository locationRepo, IRepository<EquipmentCategory> categoryRepo, IEquipmentRepository equipmentRepo, IRecordRepository recordRepo)
{
this.locationContext = locationRepo;
this.categoryContext = categoryRepo;
this.equipmentContext = equipmentRepo;
this.recordContext = recordRepo;
}
Web 应用程序本身确实按预期运行。但是,我在尝试编写测试用例时遇到了问题。例如,在测试库中,我有以下内容:
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Practices.Unity.Mvc;
using Microsoft.Practices.Unity.ObjectBuilder;
using Microsoft.Practices.Unity.StaticFactory;
using Moq;
using ITEquipmentDatabase;
using ITEquipmentDatabase.Models;
using ITEquipmentDatabase.Controllers;
namespace ITEquipmentDatabase.Tests
{
[TestFixture]
public class EquipmentController
{
[Test]
public void TestMethod()
{
var equipRepo = new Mock<IEquipmentRepository>();
var categoryRepo = new Mock<IRepository<EquipmentCategory>>();
var locationRepo = new Mock<ILocationRepository>();
var recordRepo = new Mock<IRecordRepository>();
EquipmentController controller = new EquipmentController(locationRepo.Object, categoryRepo.Object, equipRepo.Object, recordRepo.Object);
}
}
}
但是,我收到以下错误:
Error 1 'ITEquipmentDatabase.Tests.EquipmentController' does not contain a constructor that takes 4 arguments C:\Users\Khandokar\Documents\Visual Studio 2013\Projects\IT Equipment Log\ITEquipmentDatabase.Tests\EquipmentController.cs 27 46 ITEquipmentDatabase.Tests
我在我的测试项目中引用了 Unity,甚至添加了 Bootstrapper.cs(不确定是否有必要,但我试图解决上述问题)。我很确定我做错了什么,但我才刚刚开始冒险进行单元测试并且遇到了一些困难。
感谢任何建议。
您的测试 class 被命名为 EquipmentController
,您的 class 被测试也是如此。
将您的测试 class 重命名为 EquipmentControllerTests
或类似名称。
(错误消息是线索;注意它指的是 Tests.EquipmentController
)。