2013-11-09 3 views
1

Я пытался выяснить, как выполнить модульное тестирование моего приложения, но я не совсем понимаю, как все сочетается.ASP.NET MVC, репозиторий, блок работы и тестирование модуля инфраструктуры Entity

Я следовал руководству Джона Папы по PluralSight (SPA) и таким же образом построил свою модель, хранилище и единицу работы. К сожалению, он не дает никаких примеров того, как мы можем это проверить.

Я играл с Moq и нашел очень мало ссылок в Интернете, которые объясняют, как это сделать, но, к сожалению, я ничего не получил.

Некоторый код, чтобы обеспечить контекст:

public interface IRepository<T> where T : class 
{ 
    IQueryable<T> GetAll(); 
    T GetById(int id); 
    void Add(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
    void Delete(int id); 
} 

public interface IFeedbackRepository : IRepository<Feedback> 
{ 
    IQueryable<Feedback> GetByFeedbackFor(int id); 
} 

public class FeedbackRepository : EFRepository<Feedback>, IFeedbackRepository 
{ 
    public FeedbackRepository(WebAppDbContext context) : base(context) { } 
    public IQueryable<Feedback> GetByFeedbackFor(int id) 
    { 
     return DbSet.Where(f => f.FeedbackForId == id); 
    } 
} 

public interface IWebAppUow 
{ 
    void Commit(); 

    IFeedbackRepository Feedbacks { get; } 
} 

    public void TestMethod1() 
    { 
    Mock<IWebAppUow> mockUnitOfWork = new Mock<IWebAppUow>(); 

    // THEN ?? 
    } 

Edit: Я нашел эту ссылку (http://msdn.microsoft.com/en-us/data/dn314429.aspx), который объясняет, как это сделать, но работает непосредственно на DbSet. Если кто-то может объяснить, как мы можем изменить этот пример, чтобы использовать шаблон UoW и Repository, который был бы грандиозным!

+0

Вам нужно высмеять 'IWebAppUow', если вы собираетесь протестировать код, который его использует. Поэтому трудно ответить на ваш вопрос, не видя фактического кода, который вы хотите проверить. –

+0

Скажем, у меня есть следующие в моей FeedbackRepository: общественности Обратная связь GetByIds (интермедиат feedbackForId, внутр feedbackFromId) { возвращение DbSet.FirstOrDefault ( ф => f.FeedbackForId == feedbackForId && f.FeedbackFromId == feedbackFromId ); } – teh0wner

+0

Тогда вы, вероятно, захотите высмеять свой репозиторий. –

ответ

1

Если вы новичок в модульном тестировании, тестирование EF - это не лучший способ начать работу, потому что довольно сложно издеваться над его контекстом и всем API. Я бы рекомендовал следующие простые примеры.

Для тестирования модулей EF я бы рекомендовал вам зарегистрироваться в Effort frame work. Вот что он объясняет на своем сайте

усилию является мощным инструментом, который позволяет удобный способ создания автоматизированных тестов для приложений на основе Entity Framework. Это , в основном поставщик ADO.NET, который выполняет все операции с данными на в простой базе данных основной базы данных вместо традиционной внешней базы данных . Он предоставляет некоторые интуитивные вспомогательные методы, так что действительно прост в использовании этого провайдера с существующими классами ObjectContext или DbContext. Простое дополнение к существующему коду может быть достаточно для создания тестов, управляемых данными, которые могут работать без наличия внешней базы данных .

+0

Я уже много тестировал Unit Testing, но не на ASP.NET или WebApplicatios вообще. – teh0wner

1

Итак, если я правильно понял ваш комментарий, вы хотите проверить методы своего класса FeedbackRepository. Давайте посмотрим, как это сделать для метода GetByFeedbackFor.

Вы передаете WebAppDbContext context в своем FeedbackRepository. Это не очень хорошо. Вероятно, вы не сможете проверить этот код. Вы должны извлечь IWebAppDbContext интерфейс и передать его в FeedbackRepository ctor.

Я не знаю, что за этим кодом return DbSet.Where(f => f.FeedbackForId == id); поэтому я могу только предположить, что это какое-то свойство базового класса ... Но если предположить, что вы используете контекст здесь не DbSet свойства вашего метода испытаний будет выглядеть как рядом (я думаю, что это будет не слишком сложно, чтобы переписать его в случае базового имущества (или может быть даже он будет работать как есть)):

public void ShouldReturnFeedbacksForCorrectId() 
{ 
    var contextMock = new Mock<IWebAppDbContext>(); 

    // fill expected for example with 2 entities with FeedbackForId == 1 
    IQueryable<Feedback> expected = InitWithDataSomehow(); 
    contextMock.Setup(i => i.Feedbacks).Returns(expected); 
    var repositoryUnderTest = new FeedbackRepository(contextMock); 

    IQueryable<Feedback> actualResult = repositoryUnderTest.GetByFeedbackFor(1); 

    Assert.AreEqual(expected, actualResult); 
} 
+0

Вы поняли правильно. Я извлечу WebAppDbContext для интерфейса и посмотрю, работает ли это! Вернусь к вам, как только я это сделаю. – teh0wner

+0

My WebAppDbContext расширяет IdentityContext , который используется в ASP.NET Identity .. как я буду продолжать это делать? – teh0wner

1

Я бы модульное тестирование вашего хранилища, то DbContext является конкретный класс, который зависит от реальной базы данных, насколько я знаю, я не могу издеваться над ним с помощью Moq. Так что я делаю, это сосредоточиться на модульном тестировании кодов, которые используют репозиторий, и вместо этого имитируют репозитории.

Чтобы проверить ваш репозиторий, я бы пошел с интеграционными тестами.

+0

Код, который использует репозиторий, будет Uow, который, в свою очередь, используется контроллером. Вместо этого вы предлагаете модульное тестирование? – teh0wner

+0

Я не уверен в этой архитектуре. Архитектура, с которой я знаком, заключается в том, что служба будет зависеть от UoW и репозитория, вы бы издевались над этими тестами и модулем тестирования метода службы. –

+0

Я следил за архитектурой, которую использовал Джон Папа в учебнике hia SPA pluralSight. У вас есть учебник для того, кто обсуждает? Должен признаться, что я никогда не был в своей архитектуре, я обычно старался как можно проще, но с этим проектом я пытаюсь понять это с самого начала. Подходящий, масштабируемый и легкий для новых пользователей, чтобы перейти. – teh0wner

Смежные вопросы