如何解决使用 Ninject 注入依赖而不使用构造函数注入 - 单元测试
我正在为现有的 .NET Framework 4.5 API 项目创建单元测试。现有项目通过设计具有无参数构造函数,并且使用 Ninject 按照下面的类实现了依赖注入。
我想模拟接口并创建类的实例以进行测试,如下所示,但构造函数是无参数的。我不知道如何注入我的 Mock member.Object。主要目标是我不想改变现有类的设计,除非别无他法。
public class MemberController : ApiController
{
StandardKernel DependencyKernel;
private IMember member;
public MemberController()
{
DependencyKernel = new StandardKernel();
DependencyKernel.Load(Assembly.GetExecutingAssembly());
member = DependencyKernel.Get<IMember>();
}
[HttpPost]
public HttpResponseMessage AddMember(MemberRequest model)
{
try
{
int memberRecords;
member.SaveMember(model,out memberRecords);
if (memberRecords > 0)
return new HttpResponseMessage { StatusCode = HttpStatusCode.Conflict,Content = new StringContent("Member with same reference exists") };
else
return new HttpResponseMessage { StatusCode = HttpStatusCode.OK,Content = new StringContent("Member added successfully") };
}
catch (Exception ex)
{
return new HttpResponseMessage { StatusCode = HttpStatusCode.InternalServerError,Content = new StringContent(ex.Message) };
}
}
}
//测试类
public class MemberControllerTests
{
StandardKernel DependencyKernel;
private MemberController memberController;
Mock<IMember> member = new Mock<IMember>();
public MemberControllerTests()
{
DependencyKernel = new StandardKernel();
DependencyKernel.Load(Assembly.GetExecutingAssembly());
}
[SetUp]
public void Setup()
{
}
[Test]
public void should_AddMember()
{
//Arrange
MemberRequest member = new MemberRequest{ };
int memberRecords;
member.Setup(x => x.SaveMember(member,out memberRecords));
memberController = new MemberController(member.Object); //This will obviously not work,the MemberController has parameterless constructor
//Act
var result = MemberController.AddMember(member);
//Assert
Assert.AreEqual(result.StatusCode,HttpStatusCode.OK);
}
}
解决方法
This post 有问题的答案。如果 IMember 成员属性在 MemberController 中公开,我可以新建 MemberController 类并将其成员属性的值设置为 MOCK。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。