用Moq嘲笑NHibernate JoinAlias

时间:2014-08-04 18:04:12

标签: c# unit-testing nhibernate moq

我有以下存储库代码,它将根据ID值返回Company对象,搜索标准Company表和另一个名为ExternalCompany的表。

public Company FindByIdJoin(long id)
{
    ExternalCompany xcomp = null;
    return Session.QueryOver<Company>()
        .Where(p => p.ObjectId == id)
        .JoinAlias(p => p.ExternalCompanies, () => xcomp, JoinType.LeftOuterJoin)
        .SingleOrDefault<Company>();
}

代码返回我期望的值。但是,我遇到的麻烦是编写一个Moq单元测试来处理JoinAlias调用。

在一个名为FindById的简单方法中,除了JoinAlias没有行外,代码基本相同。这种简单方法的单元测试是:

[Test]
public void FindById_returns_Company_for_valid_Id()
{
    // Arrange
    Mock<IQueryOver<Company, Company>> mockQueryOver = new Mock<IQueryOver<Company, Company>>();

    mockQueryOver.Setup(x => x.Where(It.IsAny<Expression<Func<Company, bool>>>())).Returns(mockQueryOver.Object);
    mockQueryOver.Setup(x => x.SingleOrDefault()).Returns(fake_Company);

    // Act
    var result = _repository.FindById(fake_Company.ObjectId);

    // Assert
    Assert.IsNotNull(result);
    mockQueryOver.VerifyAll();
}

此测试正常运行并且没有问题(fake_Company和_repository在别处定义)。

问题是试图为FindByIdJoin电话进行测试。我尝试使用这样的附加设置行(在Where和SingleOrDefault设置行之间):

mockQueryOver.Setup(x => x.JoinAlias(It.IsAny<Expression<Func<Company>>>(), It.IsAny<Expression<Func<ExternalCompany>>>(), JoinType.LeftOuterJoin)).Returns(mockQueryOver.Object);

系统告诉我“IQueryOver的最佳重载方法匹配......有一些无效的参数。”

所以,我在安装程序上尝试了其他一些变体,但找不到可行的模式。

我的问题是:哪些安装参数适用于JoinAlias,以便我可以正确测试FindByIdJoin方法?谢谢!

2 个答案:

答案 0 :(得分:1)

您正在使用的JoinAlias的特定重载是

IQueryOver<TRoot, TSubType> JoinAlias(
                                Expression<Func<TSubType, object>> path, 
                                Expression<Func<object>> alias, 
                                JoinType joinType);

因此,您的设置需要与此匹配。根据您设置IQueryOver模拟的方式,正确的设置将是

mockQueryOver.Setup(x => x.JoinAlias(
                               It.IsAny<Expression<Func<Company, object>>>(), 
                               It.IsAny<Expression<Func<object>>>(),
                               JoinType.LeftOuterJoin))
             .Returns(mockQueryOver.Object);

答案 1 :(得分:0)

不应该使用MOQ进行行为测试吗?这样的数据访问测试似乎是依赖于状态的,我认为使用模拟对象来测试这样一个系统是一种过度杀伤。