C# 如何模拟存储库以用作控制器的参数?

C# 如何模拟存储库以用作控制器的参数?,c#,asp.net-mvc,entity-framework,unit-testing,moq,C#,Asp.net Mvc,Entity Framework,Unit Testing,Moq,我正在使用EntityFramework6为一个C#MVC5项目构建单元测试。我试图使用Moq来模拟我的blog存储库,Moq将被用作我试图测试的BlogController的参数。事实上,我的单元测试工作得很好,但为了做到这一点,我创建了一个假的BlogRepository类,当时我更愿意研究如何使用Moq来完成它 我遇到的问题是,控制器希望参数的类型为IBlogRepository,但只将其视为Mock。所以我得到了一个无效的参数错误。我以为这就是它的用途 以下是我创建模拟的尝试: Mock

我正在使用EntityFramework6为一个C#MVC5项目构建单元测试。我试图使用Moq来模拟我的blog存储库,Moq将被用作我试图测试的BlogController的参数。事实上,我的单元测试工作得很好,但为了做到这一点,我创建了一个假的BlogRepository类,当时我更愿意研究如何使用Moq来完成它

我遇到的问题是,控制器希望参数的类型为IBlogRepository,但只将其视为Mock。所以我得到了一个无效的参数错误。我以为这就是它的用途

以下是我创建模拟的尝试:

Mock<IBlogRepository> blogRepo = new Mock<IBlogRepository>();
blogRepo.Setup(t => t.GetBlogByID(It.IsAny<int>())).Returns<Blog>(blog => new Blog());

我做错了什么?还是我有错误的想法。任何帮助都将不胜感激。谢谢。

您应该将
blogRepo.Object
而不是
blogRepo
传递给您的控制器。

谢谢,太好了。我真不敢相信我错过了。我想我今天盯着代码看得太久了。
iblogrepo
<代码>iblogrepoblog<代码> BrRoPoP= RePoBoox您可能想考虑RESHARPER对私有成员的命名约定,这样您就不需要两次命名同一个东西。
public class BlogController : Controller
{
    IBlogRepository blogRepo;

    public BlogController(IBlogRepository repoBlog)
    {
        blogRepo = repoBlog;
    }