0

我需要测试在方法列表中调用了特定的 Func,例如:

public class ProductController : BaseController
    {
        private readonly Func<IProductRepository> prodRepo;
        public ProductController(Func<IProductRepository> _prodRepo)
       {
            prodRepo = _prodRepo;
       } 
        public ActionResult List(string applicationID)
        {
            var products = prodRepo().GetForApp(applicationID).ToList();
            return PartialView("_List",products);
        }
}

在这种情况下,我需要验证是否调用了prodRepo().GetForApp(applicationID)

4

2 回答 2

0

我建议您以Arrange-Act-Assert风格编写测试。你可以在Ayende 的博客上阅读更多内容

安排阶段

首先定义MockRepository和期望:

var mockRepository = new MockRepository();

var repository = mockRepository.StrictMock<IProductRepository>();

using(mockRepository.Record())
{
    repository.Expect(x => x.GetForApp(Arg<string>.Is.Anything)).Return(new string[0]).Repeat.Once();
}

      var productController = new ProductController((Func<IProductRepository>)(() => repository));

行动阶段

执行操作:

productController.List("testApplicationID");

断言阶段

验证结果:

repository.VerifyAllExpectations();

缺少接口IProductRepository

public interface IProductRepository
{
    IEnumerable<string> GetForApp(string applicationID);
}
于 2012-08-08T07:23:26.783 回答
0

你真的需要验证 Func 被调用了吗?或者您是否需要验证 ProductController 是否正确检索产品?

如果是后者,只需设置 IProductRepository 的模拟以返回一些产品,通过 lambda 将其传递,并断言您获得的产品是正确的。通常,如果某些东西正在提供信息(act/arrange/assert 中的“arrange”阶段,或者 given/when/then 中的“given”),那么您需要一个stub而不是 mock

您真正需要使用模拟并验证是否已调用某些内容的唯一时间是当被测类委派职责时 - 例如,将产品保存在存储库中。

另外,请查看Moq ...在 Moq IMO 中设置存根要容易一些。

于 2012-08-08T09:34:28.923 回答