我是TDD,ASP.NET MVC和LinqToSql的新手。 我正在尝试为我的存储库编写测试,它使用LinqToSql从存储过程中获取数据。
这是正在测试的存储库方法:
public int GetResponseCount(int campaignId)
{
var results = (new MyDBDataContext()).GetResponseCountById(campaignId);
foreach (GetResponseCountByIdResult result in results)
{
return (result.ResponseCount != null) ? result.ResponseCount.Value : 0;
}
return 0;
}
这是测试中的代码:
var myDBDataContext = new Mock<MyDBDataContext>();
var result = new Mock<ISingleResult<GetResponseCountByIdResult>>().Object();
myDBDataContext.Setup(x => x.GetResponseCountById(It.IsAny<int>())).Returns(result).Verifiable();
...
...
有两个问题:
1)sored过程返回单个整数结果。但是我必须遍历LinqToSql的响应以获得该值。哪个不理想。有没有更好的方法呢?
2)测试中的代码无法编译。编译器说 - 不可调用的成员'Moq.Mock<System.Data.Linq.ISingleResult<GetResponseCountByResult>>.Object' cannot be used like a method.
如何编写测试以验证我的存储库方法是否在LinqToSql中调用了正确的方法?
非常感谢!
答案 0 :(得分:1)
我倾向于封装对DataContext的访问,以便您可以拦截对它的访问(从而模拟DC)以进行单元测试。这种方法允许您在需要时调整查询以获得单个结果:
public class MyDataAccess{
public X GetMyX(){
using (var ctx = new DataContext()){
return (from x in ctx.TheXs where... select x).FirstOrDefault();
}
}
}
这样,您可以模拟数据上下文,在单元测试中提供自己的结果,并且当您确信只有一个结果时,还可以调整查询以从序列中获得第一个答案。
祝福,
安德鲁