首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Ninject的xUnit.net

带Ninject的xUnit.net
EN

Stack Overflow用户
提问于 2011-02-20 12:12:15
回答 2查看 1.8K关注 0票数 3

我在我的MVC3项目中使用了Ninject,它工作得很好,但是我想知道在我的测试项目中使用Ninject的好方法是什么?

以下是我目前正在做的事情:

代码语言:javascript
复制
[Fact]
public void ReturnsViewResultWithDefaultViewName()
{
    // Arrange
    var membershipService = new MembershipService(new EFMembershipProvider());
    var transactionService = new TransactionService();
    var controller = new HomeController(membershipService, transactionService);

    // Act
    var result = controller.Index();

    // Assert
    var viewResult = Assert.IsType<ViewResult>(result);
    Assert.Empty(viewResult.ViewName);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-10 02:41:44

您的测试似乎使用了NInject在MVC框架下运行时需要填充的所有依赖类。当在单元测试中使用模拟时,IoC的真正好处就来了。

如果您使用Moq,您的单元测试可能如下所示:

代码语言:javascript
复制
    // Arrange
    var membershipService = new Mock<IMembershipService>();
    membershipService.Setup(m => m.CurrentUser)
        .Returns(new MyPrincipal() { Name = "Bob", ID = 12345 });
    var transactionService = new Mock<ITransactionService>();
    transactionService.Setup(t => t.SomeRandomMethod())
        .Throws<MyBadTransactionException>();
    var controller = new HomeController(membershipService.Object, transactionService.Object);
...

这使您能够创建在使用应用程序的普通“运行时”对象时很难产生的条件。此外,它将被测类(示例中的HomeController)与其他对象完全隔离,这将使您的单元测试运行得更快。

查看Moq项目或谷歌"moq“获取更多信息。当然,还有其他的模仿框架。我只是更熟悉Moq。

票数 4
EN

Stack Overflow用户

发布于 2011-02-21 00:18:43

遗传上被接受的建议是:不要在测试中使用IoC -使用Ninject的目标是你在测试中首先不需要大量的东西。当事情变得太复杂时,它会帮助代码告诉你。

如果你觉得你的代码确实有不可避免的复杂性,你不能通过改进设计来让人满意,看看AutoFixture,特别是xunit.net集成-它和/或其他自动锁定容器可能是合适的,因为它们直接解决了你在问题中强调的问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5055201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档