Не может смоделировать что-то вроде TableDomainService, где EntityContext установлен в определении класса - PullRequest
1 голос
/ 09 января 2011

Я пытаюсь изучить и реализовать TDD, в частности, используя Moq, и я столкнулся с дизайном, который я не могу понять, как издеваться:

namespace RIACompletelyRelativeWebService.Web.Services
{
    [EnableClientAccess]
    public class AncestorDomainService : TableDomainService<AncestorEntityContext>
    {
        public AncestorDomainService()
        {
            //this.EntityContext = new AncestorEntityContext();
        }
        public IQueryable<AncestorEntity> GetAncestorEntities()
        {
            return this.EntityContext.AncestorEntities;
        }

        public void AddAncestorEntity(AncestorEntity entity)
        {
            this.EntityContext.AncestorEntities.Add(entity);
        }
    }
}

Я думаю, что мне нужно смоделировать TableDomainService, чтобы я мог проверить свою логику AncestorDomainService, не запуская Azure. Я устал примерно так:

public class AncestorDomainService<TEntityContext> : TableDomainService<TEntityContext> where TEntityContext is a TableEntityContext

Но TableDomainService не понравилось использование универсального. Я также попытался установить EntityContext, но он только для чтения. Я видел, как другие люди используют общий DomainService и шаблон проектирования Repository, но поскольку TableDomainService позволяет мне использовать таблицы Azure за кулисами, я думаю, что мне нужно придерживаться TableDomainService <>. Должен ли я просто подделать TableDomainService, TableEntityContext и TableEntitySet, который возвращается?

Ответы [ 2 ]

2 голосов
/ 14 марта 2011

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

Вы можете попытаться абстрагировать AncestorDomainService (представляя IAncestorDomainService), а затем использовать moq для макета IAncestorDomainService.Ваша логика переместится в другой класс, имеющий зависимость от IAncestorDomainService.Я сделал это с Linq2Sql (который, кажется, имеет аналогичный дизайн, а также возвращает IQueryable).Я бы не стал издеваться над «внутренними компонентами» TableDomainService, потому что этот материал обычно не предназначен для простого тестирования.

0 голосов
/ 22 августа 2011

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

Поскольку весь смысл вашего AncestorDomainService заключается в том, чтобы иметь дело с Azure, макетирование его базового класса не имеет особого смысла для оценки эффективности теста. (Некоторые люди предпочитают оптимизировать скорость тестирования, а не эффективность, но я думаю, что это пустая трата времени.)

...