Модульное тестирование - Использование Structuremap с MOQ - PullRequest
1 голос
/ 28 марта 2012

Я хочу общие / oneline операторы для конфигурации структуры карты. пожалуйста, посмотрите следующий код и предложите изменения:

Класс конфигурации структуры карты:

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];       
        }
}

Примечание:

Это было сделано для того, чтобы в реальном модульном тесте нам не приходилось писать методы настройки, поскольку это делается при создании зависимого объекта с использованием Structuremap.

Работает нормально, но я хочу изменить код файла конфигурации на общий

Я написал это для имплантации, как это:

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

это возможно для конфигурации модульного теста?

1 Ответ

0 голосов
/ 28 марта 2012

Это возможно, хотя вам нужно будет указать все типы типов объектов, которые будут использоваться, и передать их как типы.И вам нужно будет использовать неуниверсальную версию функций (чтобы можно было писать For (тип) вместо For).Таким образом, все ваши функции будут работать только с переменными типа и будут выглядеть как простые методы.

...