1

嗨,我正在尝试建立一个测试项目,以便在使用 Unity IoC 容器和 Moq 时进行一些单元测试。

当我尝试在 Unity 中注册类型时,我似乎遇到了错误。这是我的代码:

public static class SetupMockObjects
{
    public static IProductRepository GetProductRepository() {
        Mock<IProductRepository> productRepository = new Mock<IProductRepository>();
        productRepository.Setup(m => m.Products).Returns(new List<Product> { 
            new Product { Name = "Football" , Price = 25 },
            new Product { Name = "Surf board" , Price = 179 },
            new Product { Name = "Running shoes" , Price = 95 }
        });

        return productRepository.Object;
    }
}

public static void Initialise()
{
    var container = BuildUnityContainer();
    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

private static IUnityContainer BuildUnityContainer()
{
     var container = new UnityContainer();
     container.RegisterType<IProductRepository , SetupMockObjects.GetProductRepository()>();
     return container;
}

现在我在这里创建一个模拟对象只是因为我不想创建数据访问层,所以我认为创建一个模拟对象会更容易。

问题出在 BuildUnityContainer() 方法中,当我尝试注册一个类型时,我收到以下错误:

Error   1   Invalid expression term ',' 
Error   2   ; expected  
Error   3   ; expected  
Error   4   Invalid expression term ')' 
Error   5   ) expected  

我很确定我使用正确的通用参数调用 RegisterType 这就是为什么我不明白为什么会抛出这些错误。我在哪里犯了错误?

4

1 回答 1

2

您正在尝试SetupMockObjects.GetProductRepository()用作类型参数。那是行不通的——类型参数必须是类型(或类型参数)的名称。我怀疑您打算将其用作常规参数:

container.RegisterInstance<IProductRepository>(SetupMockObjects.GetProductRepository());

或者也许更易读:

var repository = SetupMockObjects.GetProductRepository();
container.RegisterInstance<IProductRepository>(repository);

或者,如果类型推断有效(我面前没有文档来检查声明),您可以使用:

container.RegisterInstance(SetupMockObjects.GetProductRepository());

毕竟方法的返回类型和你要指定的类型参数是一样的。

请注意,我已将调用从更改为RegisterTypeRegisterInstance因为您只是尝试将接口绑定到特定实例。

于 2013-05-10T13:22:31.670 回答