2016-07-24 4 views
0

Я пытаюсь проверить свой метод удаления для моей службы, чтобы сделать это. Я пытаюсь сначала добавить элемент в репозиторий. Однако, я не думаю, что мой метод добавления репозитория вызывается, потому что _mockRepository.Object.GetAll() всегда имеет значение null. Я попытался вмешаться в отладчик, и он просто проскакивает над ним. Что я делаю не так?Moq testing Метод удаления

public class CommentServiceTest 
{ 
    private Mock<IRepository<Comment>> _mockRepository; 
    private ICommentService _service; 
    private ModelStateDictionary _modelState; 

    public CommentServiceTest() 
    { 
     _modelState = new ModelStateDictionary(); 
     _mockRepository = new Mock<IRepository<Comment>>(); 
     _service = new CommentService(new ModelStateWrapper(_modelState), _mockRepository.Object); 
    } 

    [Fact] 
    public void Delete() 
    { 
     var comment = new Comment("BodyText") 
     { 
      Audio = new Audio(), 
      Date = DateTime.Now 
     }; 

     _mockRepository.Object.Add(comment); 
     //Nothing in repository collection here still 
     var commentToDelete = _mockRepository.Object.GetAll().First(); 
     _service.Delete(commentToDelete); 

     Assert.DoesNotContain(commentToDelete, _mockRepository.Object.GetAll()); 
    } 
} 

public class Repository<T, TC> : IRepository<T> where T : class where TC : DbContext 
{ 
    private bool _disposed; 

    protected TC Context { get; } 

    public Repository() 
    { 

    } 

    public Repository(TC context) 
    { 
     Context = context; 
    } 

    public virtual IQueryable<T> GetAll() 
    { 
     return Context.Set<T>(); 
    } 

    public virtual void Add(T entity) 
    { 
     Context.Set<T>().Add(entity); 
     Save(); 
    } 

    public virtual void Save() 
    { 
     Context.SaveChanges(); 
    } 
} 

}

ответ

3

Ваш репозиторий - mock, поэтому по умолчанию он не содержит никакого фактического поведения. Сначала вы должны настроить макет, чтобы принимать вызовы методов на издеваемом объекте. Таким образом, в вашем случае вы должны сначала сказать, что макет обрабатывает добавление каким-то образом (в дополнение к удалению).

Однако, поскольку вы на самом деле просто хотите протестировать службу, которая удаляет что-либо из службы, вам не нужно сначала добавлять объект в mock-репозиторий. Вам просто нужно проверить, правильно ли удален элемент из ложного хранилища. То есть поскольку репозиторий - макет, вам не нужно что-то добавлять, чтобы удалить его.

Ваш тест должен выглядеть следующим образом:

[Fact] 
public void Delete() 
{ 
    // arrange 
    var comment = new Comment("BodyText") 
    { 
     Audio = new Audio(), 
     Date = DateTime.Now 
    }; 

    // set up the repository’s Delete call 
    _mockRepository.Setup(r => r.Delete(It.IsAny<Comment>())); 

    // act 
    _service.Delete(comment); 

    // assert 
    // verify that the Delete method we set up above was called 
    // with the comment as the first argument 
    _mockRepository.Verify(r => r.Delete(comment)); 
} 

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

3

Вы насмехаясь из всех методов на интерфейсе IRepository<T>, но не говорят высмеивал версию, что делать, когда Add или GetAll называются.

Вам нужно что-то вроде этого:

_mockRepository 
.Setup(r => r.Add(It.IsAny<Comment>())) 
.Callback(c => _service.Add(c)); 

_mockRepository 
.Setup(r => r.GetAll()) 
.Returns(_service.GetAll()); 

Это (или нечто подобное) воля означает Add кладет вещи в свой список, и GetAll возвращает то, что находится в вашем списке.

В качестве альтернативы вы можете попробовать добавить комментарий в service непосредственно, а не в репозиторий. Не видя, как выполняется сервис, я могу только догадываться, как это будет работать.