使用Moq进行单元测试,Code使用Linq to Sql进行存储过程

时间:2009-09-10 10:01:14

标签: asp.net-mvc linq-to-sql moq

我是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中调用了正确的方法?

非常感谢!

1 个答案:

答案 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();
    }
  }
}

这样,您可以模拟数据上下文,在单元测试中提供自己的结果,并且当您确信只有一个结果时,还可以调整查询以从序列中获得第一个答案。

祝福,

安德鲁

相关问题