【发布时间】:2013-03-14 03:49:25
【问题描述】:
我正在将单元测试引入现有的网络表单应用程序。我正在使用起订量和 Autofac。我试图将代码更改保持在最低限度,但需要实施单元测试。
所以我有一个表示组件、一个业务层和一个数据访问层。我的业务层如下所示:
public class EmployeeBL
{
public Employee SelectById(int id)
{
return new EmployeeDA().SelectById(id);
}
}
我的数据访问权限如下所示:
public class EmployeeDA
{
// unitOfWork defined in the constructor
public Employee SelectById(int id)
{
return unitOfWork.Employees.Where(e => e.id == id);
}
}
Autofac 的 webforms 程序集允许您声明公共属性并指定 web.config 设置以通过 HttpModule 自动注入依赖项。为了测试EmployeeBL,我对web.config 进行了更改并将EmployeeDA 声明为属性:
// Modified for testing
[InjectProperties]
public class EmployeeBL
{
// public property to allow Autofac property injection
public IEmployeeDA EmployeeDA { get; set; }
public Employee SelectById(int id)
{
return EmployeeDA.SelectById(id);
}
}
这适用于运行 webforms 应用程序,但问题是我需要独立于 webforms 实例对业务层进行单元测试。我想在我的EmployeeBL 上保留[InjectProperties] 属性,但我无法通过文档告诉我如何让EmployeeDA 注入其属性。
public class EmployeeBLTest
{
private static IContainer { get; set; }
[TestInitialize]
public void Initialize()
{
var builder = new ContainerBuilder();
// Use my fake employeeDA for testing
builder.RegisterType<FakeEmployeeDA>().As<IEmployeeDA>();
// Something magical happens
}
[TestMethod]
public void SelectByIdTest(int id) { /* testing stuff */ }
}
【问题讨论】:
标签: inversion-of-control webforms autofac