2014-11-25 5 views
1

Пытается размыть мой контекст EF, который связан с моим репозиторием. Я использую Moq, пытаясь настроить изделенный контекст и передать его в репозиторий конструктором.Mocking DbContext для репозитория TDD

После этого Im вызывающего метод Add, чтобы просто добавить новый объект, который я после этого попытаться Утверждаю, проверяя, если контекст я перешел в состоянии изменился ...

Ошибки Im получения является NullReference Exception и я думаю, его, потому что мой насмешливый не правильно ..

Это код:

Тест с не работает макет

[TestClass] 
public class GameRepositoryTests 
{ 
    [TestMethod] 
    public void PlayerThatWonMustBeAddedToTopList() 
    { 
     // Arrange 
     var expected = "Player added successfully"; 

     var dbContextMock = new Mock<Context>(); 
     // Need to setup the Context?? 

     IRepository gameRepository = new GameRepository(dbContextMock.Object); 

     var user = "MyName"; 

     // Act 
     gameRepository.Add(user); 

     // Assert 

     dbContextMock.VerifySet(o => o.Entry(new ScoreBoard()).State = EntityState.Added); 
    } 
} 

public class ScoreBoard 
{ 

} 

Repository

public class GameRepository : IRepository 
{ 
    private readonly Context _context; 

    public GameRepository() 
     : this(new Context()) 
    { 
     // Blank! 
    } 

    // Passing in the Mock here... 
    public GameRepository(Context context) 
    { 
     this._context = context; 
    } 

    // Method under test... 
    public void Add<T>(T entity) where T : class 
    { 
     _context.Set<T>().Add(entity); 
    } 
} 

Контекст

public class Context : DbContext 
{ 
    public Context() 
     : base("name=DefaultConnection") 
    { 

    } 
} 
+0

Какая строка выдает исключение? Какой объект является «нулевым»? Где этот объект установлен? Я бы * угадал *, что '. Set ()' возвращает 'null'. Кажется, что макет должен быть проинформирован о том, что вернуть с этого во время этапа «Упорядочить». – David

+0

_context.Set () .Add (entity); <--- Эта строка. И потому, что контекст не издевается правильно. Удивительно, как я должен настроить его? – Rovdjuret

+1

И это еще одна причина, по которой репозитории с Entity Framework - это плохая идея. Вы буквально проверяете, что метод 'Add' вашего репо вызывает метод' Add' 'DbSet'. Вот некоторые из них. –

ответ

1

Вы должны издеваться вне Set<T>() вызов.

Что-то вроде этого должно получиться.

// Arrange 
var context = new Mock<Context>(); 
var set = new Mock<DbSet<User>>(); 

context.Setup(c => c.Set<User>()).Returns(set.Object); 

// Act 

// Assert 
set.Verify(s => s.Add(It.IsAny<User>()), Times.Once()); 

Вам не нужно, чтобы проверить что-либо кроме того, что Add() был вызван нижележащего DbSet. Выполнение вашей проверки того факта, что состояние Entity было изменено, не является необходимым. Если вы подтвердите, что было вызвано Add(), этого должно быть достаточно, так как вы можете с уверенностью предположить, что EF работает правильно.

Этот пример работает только для репозиториев для объекта User. Вам придется настраивать mocks по-разному для каждого репозитория, который вы хотите протестировать таким образом. Возможно, вы могли бы написать более общую версию этого, если это необходимо.

+0

Спасибо, друг! Я попробую это прямо и ответим позже! – Rovdjuret

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