Похоже, вы хотите написать тест, который демонстрирует охват вашего заявления Linq.Вы уже указали, что ваш репозиторий является интерфейсом (IRepository ) и должен быть смоделирован.Вам просто нужно несколько примеров того, как продемонстрировать, что ваш сервисный уровень правильно фильтрует содержимое репозитория.
Вот ваш ServiceLayer, насколько я понимаю.
public class ServiceLayer
{
private readonly IRepository<GameFile> _gameRepository;
public SerivceLayer(IRepository<GameFile> repository)
{
_gameRepository = repository;
}
public IEnumerable<GameFile> FindAllActiveGamesFiles()
{
return _gameRepository
.Find() // method we need to mock
.Where( gameFile => gameFile.IsActive)
.ToList();
}
}
Давайте напишем несколько тестов .... (NUnit и Moq)
[TestFixture]
public class ServiceLayerFixture
{
protected IRepository<GameFile> Repository;
protected ServiceLayer Subject;
protected ICollection<GameFile> Results;
[Setup]
public void Setup()
{
// create our mock
Repository = new Mock<IRepository<GameFile>>().Object;
// initialize our test subject
Subject = new ServiceLayer(Repository);
}
[Test]
public void WhenRepositoryDoesNotContainItems_ServiceLayer_ReturnsAnEmptyCollection()
{
Mock.Get(Repository)
.Setup( r => r.Find())
.Returns( new List<GameFile>().AsQueryable() );
Results = Subject.FindAllActiveGameFiles();
Assert.AreEqual(0, Results.Count);
}
[Test]
public void WhenRepositoryDoesNotContainActiveItems_ServiceLayer_ReturnsAnEmptyCollection()
{
Mock.Get(Repository)
.Setup( r => r.Find())
.Returns(
new List<GameFile>()
{
new GameFile { IsActive = false },
new GameFile { IsActive = false }
}.AsQueryable() );
Results = Subject.FindAllActiveGameFiles();
Assert.AreEqual(0, Results.Count);
}
[Test]
public void WhenRepositoryContainActiveItems_ServiceLayer_FiltersItemsAppropriately()
{
Mock.Get(Repository)
.Setup( r => r.Find())
.Returns(
new List<GameFile>()
{
new GameFile { IsActive = true },
new GameFile { IsActive = false }
}.AsQueryable() );
Results = Subject.FindAllActiveGameFiles();
Assert.AreEqual(1, Results.Count);
}
}
Если ваш код останавливается, это то, что вы можете обрабатывать исключения из своего IRepository более изящно.
Так что рассмотрите:
[Test]
public void WhenTheRepositoryFails_ServiceLayer_ShouldHandleExceptionsGracefully()
{
Mock.Get(Repository)
.Setup( r => r.Find())
.Throws( new InvalidOperationException() );
Results = Subject.FindAllActiveGameFiles();
Assert.AreEqual(0, Results.Count);
}
Или, может быть, вы хотите обернуть исключение?
[Test]
[ExpectedException(typeof(GameFileNotFoundException))]
public void WhenTheRepositoryFails_ServiceLayer_ShouldReportCustomError()
{
Mock.Get(Repository)
.Setup( r => r.Find())
.Throws( new InvalidOperationException() );
Subject.FindAllActiveGameFiles();
}