Проблема с репозиторием Mock - PullRequest
1 голос
/ 25 августа 2011

У меня есть служба, содержащая следующий метод, который запрашивает репозиторий, например:

public IEnumerable<Variable> ListVariables(int instanceId, int instanceVersionId, TypeGroup typeGroup)
{
    return
        _variableRepository.Where(x => x.InstanceVersion.Instance.Id == instanceId && x.InstanceVersion.Version == instanceVersionId && x.VariableType.VariableTypeGroup.Id == Convert.ToInt32(typeGroup));
}   

Я пытаюсь написать модульный тест для проверки этого вызова, например:

[Test]
        public void ListVariables_Returns_Variables_From_Repository()
        {
            IEnumerable<Variable> reposVariables = new List<Variable>
                                                    {
                                                        new Variable {InstanceVersion = new InstanceVersion(), VariableType = new VariableType(), Value = "test value1"},
                                                        new Variable {InstanceVersion = new InstanceVersion(), VariableType = new VariableType(), Value = "test value2"},
                                                        new Variable {InstanceVersion = new InstanceVersion(), VariableType = new VariableType(), Value = "test value3"},
                                                        new Variable {InstanceVersion = new InstanceVersion(), VariableType = new VariableType(), Value = "test value4"}
                                                    };

            var mockVariableRepository = new Mock<IVariableRepository>();
            mockVariableRepository.Setup(y => y.Where(x => x.InstanceVersion.Instance.Id == 1 && x.InstanceVersion.Version == 1 && x.VariableType.VariableTypeGroup.Id == 1)).Returns(reposVariables).Verifiable();

            var service = CreateSpiralService(variableRepository: mockVariableRepository.Object);

            var result = service.ListVariables(1,1,TypeGroup.Information).ToList<Variable>();

            mockVariableRepository.Verify(y => y.Where(x => x.InstanceVersion.Instance.Id == 1 && x.InstanceVersion.Version == 1 && x.VariableType.VariableTypeGroup.Id == 1), Times.Once()); ;
            Assert.AreEqual(reposVariables, result);
        }

но когда я запускаю его, я получаю следующую ошибку:

Moq.MockException : 
Expected invocation on the mock once, but was 0 times: y => y.Where(x => (x.InstanceVersion.Instance.Id == 1 && x.InstanceVersion.Version == 1) && x.VariableType.VariableTypeGroup.Id == 1)

Configured setups:
y => y.Where(x => (x.InstanceVersion.Instance.Id == 1 && x.InstanceVersion.Version == 1) && x.VariableType.VariableTypeGroup.Id == 1), Times.Never

Performed invocations:
IReadOnlyNoIdRepository`1.Where(x => (((x.InstanceVersion.Instance.Id == value(Core.Services.Spiral.SpiralService+<>c__DisplayClass8).instanceId) AndAlso (x.InstanceVersion.Version == value(Core.Services.Spiral.SpiralService+<>c__DisplayClass8).instanceVersionId)) AndAlso (x.VariableType.VariableTypeGroup.Id == ToInt32(Convert(value(Core.Services.Spiral.SpiralService+<>c__DisplayClass8).typeGroup)))))

Кажется, что выражение, которое я передаю как часть настройки репозитория в моем тестовом приспособлении, не соответствует выражению, определенному вСам сервис.Впоследствии Assert в конце не выполняется, так как он «ожидает список из 4 элементов, но фактически возвращает список из 0 элементов»

Кто-нибудь знает, что может быть не так?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Выражение, которое вы используете, не совпадает с тем, которое вы настроили.

У вас есть настройка:

y => y.Where(x => (x.InstanceVersion.Instance.Id == 1 && x.InstanceVersion.Version == 1) && x.VariableType.VariableTypeGroup.Id == 1)

Принимая во внимание, что вы должны сделать это как:

m => m.ListVariables(
  It.Is<int>(i ==> i == 1), 
  It.Is<int>(i ==> i == 1), 
  It.Is<TypeGroup>(t => t == TypeGroup.Information))

Moq проанализирует выражение, чтобы определить, когда вы это сделаете:

var service.ListVariables(1, 1, TypeGroup.Information);

Он проверит входные данные относительно ожидаемых входных данных.

0 голосов
/ 11 ноября 2011

После дальнейшего обсуждения с коллегами, похоже, это проблема самой NHibernate. Он не соответствует двум (одинаковым) условиям в выражении Where.

...