2016-03-09 4 views
1

В моем модульном тесте я хочу проверить свой метод, который я создал для фильтрации данных из MongoDB.Cant Mock my Get() функция из моего репозитория - MongoDB.Driver 2.2.3

Когда я пытаюсь дразнить свою функцию, как это:

_repo.GetFluent<Location>((Arg.Any<Expression<Func<Location, bool>>>())) 
       .Returns(x => locations.Where(x.Arg<Expression<Func<Location, bool>>>()).ToList()); 

Он подчеркивает Returns говоря:

Невозможно преобразовать лямбда-выражения.

Раньше, когда я работал на моем простом проекте с помощью драйвера 2.0.0 MongoDB у меня не было никаких проблем, насмешливый мою Get() функцию, как это, но теперь с новым драйвером 2.2.3 У меня есть ошибка насмешливый это. Есть ли другой способ?

Я видел, что новый драйвер использует IFindFluent, а более старый я использовал MongoCursor для получения моих данных.

Должен ли я высмеивать IFindFluent как-то?

Это мой код для GetFluent() метода

public IFindFluent<TEntity, TEntity> GetFluent<TEntity>(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null) where TEntity : class, new() 
     { 
      var collection = GetCollection<TEntity>(); 
      if (filter == null) 
      { 
       var emptyFilter = Builders<TEntity>.Filter.Empty; 
       return collection.Find(emptyFilter); 
      } 
      else 
      { 
       var filterDefinition = Builders<TEntity>.Filter.Where(filter); 
       return collection.Find(filterDefinition); 
      } 
     } 
+0

Можете ли вы вставить код метода GetFluent от вас MongoRepository, пожалуйста? – Jerome2606

ответ

0

Да, вам нужно издеваться IFindFluent. Позвольте мне показать вам пример.

Я использовал NUnit и Moq для испытаний, версия драйвера 2.2.3.

public interface IRepository 
{ 
    IFindFluent<TEntity, TEntity> GetFluent<TEntity>(Expression<Func<TEntity, bool>> filter = null) 
     where TEntity : class, new(); 
} 

public class LocationService 
{ 
    public long CountLocations(IRepository repository) 
    { 
     return repository.GetFluent<Location>(location => true).Count(); 
    } 
} 

[TestFixture] 
public class LocationServiceTests 
{ 
    [Test] 
    public void CountLocationsTest() 
    { 
     const long LocationCount = 5; 

     var locationsMock = new Mock<IFindFluent<Location, Location>>(); 
     locationsMock.Setup(x => x.Count(default(CancellationToken))).Returns(LocationCount); 

     var repoMock = new Mock<IRepository>(); 
     repoMock.Setup(repo => repo.GetFluent(It.IsAny<Expression<Func<Location, bool>>>())) 
       .Returns(locationsMock.Object); 

     var locationService = new LocationService(); 
     long result = locationService.CountLocations(repoMock.Object); 

     Assert.AreEqual(LocationCount, result); 
    } 
} 
0

Хороший ответ от Usein Mambediev. Существует подобный пример, как издеваются IFindFluent с Typemock Isolator без упаковки его в интерфейс:

[TestMethod, Isolated] 
public void TestGet() 
{ 
    var target = new ClassUnderTest(); 
    var returnMock = Isolate.Fake.Instance<IFindFluent<Location, Location>>(); 

    int size = 3; 

    Isolate.WhenCalled(() => returnMock.Count()).WillReturn(size); 
    Isolate.WhenCalled(() => target.GetFluent(default(Expression<Func<Location, bool>>))).WillReturn(returnMock); 

    Assert.AreEqual(size, target.GetFluent<Location>(location => true).Count()); 
} 

Я положил свой метод в открытый класс только для того, чтобы проверить. Вам нужно только изменить цель. Удачи!