2

我正在尝试熟悉 TDD 概念并编写了第一个测试,它的“行为”部分如下所示:

repositoryStub = new Mock<IMyRepository>();
var sut = new MyController(repositoryStub.Object);
var result = sut.Index() as ViewResult;

MyController我最终(深入)实例化的控制器( )ConfigurationManager.AppSettings在创建视图模型时使用。控制器的实例化在尝试从 Web.Config 读取的行上失败,但显然,如果项目只是从 IDE 运行,则按预期运行。我正在从 web.config 文件中读取一个常量,它不应该影响测试,并且一旦从另一个 ( MyProject.Test) 项目调用它就不会失败。

我对你们的问题是如何克服这个障碍?

我不知道这是否重要,但以防万一,我正在使用xUnitTDD。谢谢!

4

1 回答 1

1

您需要意识到您使用的配置IMyRepository. 您通过抽象合约(接口)注入存储库。为什么对配置不做同样的事情?快速而幼稚的解决方案是创建IConfiguration接口并通过简单地将调用委托给ConfigurationManager. 您的构造函数如下所示:

public class MyController(IMyRepository repository, IConfiguration configuration)

这告诉我们什么?好吧,不幸的是不多。控制器需要配置的事实非常模糊。真正的问题是,它需要的配置的确切参数是什么?您需要确定那个参数,这就是您要注入的真正依赖项。考虑:

  • MyController(IMyRepository repository, IConfiguration configuration)
  • MyController(IMyRepository repository, int serviceCallTimeoutSeconds)
  • MyController(IMyRepository repository, string serviceAccessKey)

哪个更能传达其目的?您的控制器越面向单一功能,它应该使用的参数就越少。您的问题可能不在您认为的位置。

于 2013-03-23T23:13:02.720 回答