我有以下存储库代码,它将根据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
方法?谢谢!
答案 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进行行为测试吗?这样的数据访问测试似乎是依赖于状态的,我认为使用模拟对象来测试这样一个系统是一种过度杀伤。