单元测试structuremap提供了一个实现

时间:2013-12-05 10:14:52

标签: c# unit-testing

如何编写单元测试来测试请求接口是否提供了实现?我正在使用NUnit和StructureMap

根据代码中的示例,这可能是这样的吗?我遇到的问题是我不知道如何设置测试。

代码段

[Test]
public void TestCustomerRegistration()
{
    var res = ObjectFactory.GetInstance<ICustomer>();

    Assert.IsNotNull(res, "Cannot get an Customer");
}

这已存在于代码中

我不确定是否必须在ICustomer测试中使用类似的东西?不确定这是什么。

[TestFixtureSetUp]
public void SetUp()
{
    ObjectFactory.Initialize(x =>           
    {
        x.AddRegistry<InfrastructureRegistry>();
        x.AddRegistry<RepositoryRegistry>();
    });

    var container = ObjectFactory.Container;
    IDependencyResolver resolver = new SmDependencyResolver(container);
    ObjectFactory.Configure(x =>
    {
        x.For<IDependencyResolver>().Use(resolver);
    });
}

采取以下MVC控制器

我需要编写一个测试,当调用_customer.GetById(id)时,StructureMap提供'Customer'。希望这有帮助

private ICustomer _customer;

public MyController(ICustomer customer)
{
    _customer = customer;
}

public ActionResult GetCustomer(int id)
{
   var result = _customer.GetById(id);  // I need to test that _customer works
}

谢谢,

1 个答案:

答案 0 :(得分:0)

如果您正在编写无用的测试来检查StructureMap的某些配置(用于单元测试,而不是用于实际运行的应用程序),那么它很容易实现!使用Assert.IsInstanceOf<T>检查返回对象的确切类型。它应该是您希望StructureMap配置为返回客户界面的类型:

[Test]
public void TestCustomerRegistration()
{
    var customer = ObjectFactory.GetInstance<ICustomer>();
    Assert.IsNotNull(customer, "Cannot get an Customer");
    Assert.IsInstanceOf<SpecificCustomerType>(customer, "Wrong customer type"); 
}

UPDATE 你应该与其他对象隔离测试控制器(否则你不会知道失败的根源),你的控制器测试看起来应该是(Moq样本)

[Test]
public void ShouldReturnExistingCustomer()
{
    // Arrange
    int id = 42; // or random numer
    var dto = // data which ICustomer should return
    Mock<ICustomer> customerMock = new Mock<ICustomer>();
    customerMock.Setup(c => c.GetById(id)).Returns(dto)
    var controller = new MyController(customer.Object);
    // Act
    var result = controller.GetCustomer(id);
    // Assert
    customerMock.VerifyAll();
    Assert.IsNotNull(result); // etc
}

这是一个控制器测试,它验证控制器是否正常工作(并调用客户获取数据)。如果您想验证_customer是否有效,那么您应该编写客户测试。