2011-08-25 55 views
1

我有一个包含下面的方法,其中查询信息库,像这样一种服务:问题用模拟库

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))))) 

看来,我通过在为回购协议的一部分,表达我的测试夹具中的sitory设置与服务本身中定义的表达式不匹配。随后,断言在最后不成立的,因为它“预计有4个项目的清单,但实际上返回0项列表”

没有人有任何想法可能是什么回事?

回答

0

在与同事进一步讨论,这似乎是与NHibernate本身的问题。它不符合Where语句中的两个(相同)条件。

1

,您使用的是不匹配的,你必须设置的表达。

你必须设置:

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)) 

起订量将分析表达式来确定当你做:

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

它将根据预期的输入检查输入。

+0

嗨,我已经更新了问题的第一线,因为我认为这可能是一个有点混乱。我的目的是嘲笑知识库,而不是服务,这就是你在回答中似乎做的事情。 – MichaelS