【问题标题】:Unit Testing - Use of Structuremap with MOQ单元测试 - 使用带有最小起订量的 Structuremap
【发布时间】:2012-03-28 05:00:59
【问题描述】:

我想要结构图配置的通用/单行语句。请查看以下代码并提出更改建议:

结构图配置类:

class StructureMapTestConfigurationRegistry : Registry
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="DependencyConfigurationRegistry"/> class.
        /// </summary>
        public StructureMapTestConfigurationRegistry()
        {

            For<Repository.IRepository<Report>>().Use(MockObjectGenerator<Report>.RepositoryMockSetup());
            For<Repository.IRepository<RelatedContent>>().Use(MockObjectGenerator<RelatedContent>.RepositoryMockSetup());
            For<Repository.IRepository<Tags>>().Use(MockObjectGenerator<Tags>.RepositoryMockSetup());

            For<Repository.IRepository<ArticleTag>>().Use(MockObjectGenerator<ArticleTag>.RepositoryMockSetup());
            For<Repository.IRepository<ReferenceBookTag>>().Use(MockObjectGenerator<ReferenceBookTag>.RepositoryMockSetup());
            For<Repository.IRepository<EventsTag>>().Use(MockObjectGenerator<EventsTag>.RepositoryMockSetup());
            For<Repository.IRepository<CountryFactfileTag>>().Use(MockObjectGenerator<CountryFactfileTag>.RepositoryMockSetup());
}

BootStrapper 类:

public static class TestBootstrapper
    {
        public static void TestConfigureStructureMap()
        {
            ObjectFactory.Container.Dispose();
            ObjectFactory.Initialize(o => o.AddRegistry(new StructureMapTestConfigurationRegistry()));
            ObjectFactory.Container.AssertConfigurationIsValid();

        }
}

MockObjectGenerator 类:

public static class MockObjectGenerator<TEntity> where TEntity : class
    {

        private static List<TEntity> DummyTable
        {
            get
            {
                return MockEntities.GetData<TEntity>();
            }
        }

       public static IRepository<TEntity> RepositoryMockSetup()
        {
            Mock<IRepository<TEntity>> repository = new Mock<IRepository<TEntity>>(MockBehavior.Strict);
            repository.Setup(o => o.Fetch(It.IsAny<Expression<Func<TEntity, bool>>>())).Returns((Expression<Func<TEntity, bool>> i) => DummyTable.Where(i.Compile()).ToList());
            repository.Setup(o => o.Create(It.IsAny<IEnumerable<TEntity>>())).Callback<IEnumerable<TEntity>>(items => DummyTable.AddRange(items));
            repository.Setup(o => o.Delete(It.IsAny<TEntity>())).Callback<TEntity>(item => DummyTable.Remove(item));

}
}

**Mock Entities Class :**

public static class MockEntities
    {
        public static Dictionary<string, dynamic> MockData = new Dictionary<string, dynamic>();

       public static void LoadData()
        {
            MockData.Add(typeof(CMSModel.Article).Name, ArticleTestData.GetTestRecords());
            MockData.Add(typeof(CMSModel.ArticleTag).Name, RelatedArticleContentTestData.GetTestRecords());
}

public static List<T> GetData<T>() where T : class
        {
            return (List<T>)MockData[typeof(T).Name];       
        }
}

注意:

这样做是为了在实际的单元测试中,我们不必编写设置方法,因为这是在使用结构映射创建依赖对象时完成的。

它工作正常,但我想将配置文件代码重构为通用

我写它是为了实现这样的:

 For(typeof(Repository.IRepository<>)).Use(typeof(Repository.Repository<>));

是否可以进行单元测试配置?

【问题讨论】:

    标签: unit-testing moq structuremap


    【解决方案1】:

    这是可能的,尽管您需要指定将要使用的所有类型实体类型并将它们作为类型传递。而且您需要使用非泛型版本的函数(以便能够编写 For(type) 而不是 For)。这样,您的所有函数都只能在类型变量上工作,并且看起来像简单的方法。

    【讨论】:

    • 我可以这样写吗:For)>().Use(typeof(MockObjectGenerator.RepositoryMockSetup()));
    • 不,你不能。你必须放弃泛型并使用通常的 for(type) 来设置你的模拟。
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多