c#模拟受保护的内部虚函数,输入为对象

c#模拟受保护的内部虚函数,输入为对象,c#,mocking,moq,protected,C#,Mocking,Moq,Protected,我正在测试一个公共API,但是在内部,我的API调用了一个带有签名的函数,比如 protected internal virtual void AddBook(Book book) { if (null !=book) bookList= book; } 而书目也被定义为 public virtual BookInformation bookList{ get; protected internal set; } 我需要设置这个书单。我可以使用AddBook函数或者直

我正在测试一个公共API,但是在内部,我的API调用了一个带有签名的函数,比如

protected internal virtual void AddBook(Book book)
{
    if (null !=book)
        bookList= book;
}
而书目也被定义为

public virtual BookInformation bookList{ get; protected internal set; }
我需要设置这个书单。我可以使用AddBook函数或者直接访问bookList。书目也被定义为“
受保护的内部集”

我试过了

var mockModule = new Mock<myModule> { CallBase = true };
mockModule.Protected()
    .Setup<Book>("AddBook", book);
var mockModule=newmock{CallBase=true};
mockModule.Protected()
.设置(“AddBook”,book);
但我得到的错误是“AddBook”不存在

你知道我遗漏了什么吗

更新 我被赶在最后期限前,所以我最终嘲笑了全班同学。这就解决了我现在的问题。

当您编写
.Setup(“AddBook”,book)时
这是模拟返回类型为
Book
的方法,但返回类型为void。这就是为什么会出现
AddBook
不存在的错误。您需要调用
.Setup(“AddBook”,book)

要模拟受保护的成员,必须首先在测试夹具的顶部包括以下内容:

using Moq.Protected;
然后在mock上调用
Protected()
,然后可以使用通用的
设置
和方法的返回类型

var mock = new Mock<MyClass>();
mock.Protected()
     .Setup<int>("MyProtectedGetIntMethod")
     .Returns(1);
var mock=new mock();
mock.Protected()
.设置(“MyProtectedGetItemMethod”)
.申报表(1);

如果该方法返回void,则根据

如果需要参数匹配,则必须使用
ItExpr
而不是
It

//在测试夹具的顶部
使用最小起重量保护;
//在测试中
var mock=new mock{CallBase=true};
//如果需要参数匹配,则必须使用ItExpr而不是It
//计划为vNext改进此功能
mock.Protected()
.Setup(“AddBook”,ItExpr.IsAny());

与这个问题无关,但是一本
可以被分配到
图书列表
(假设是一个图书列表)这一事实有点令人困惑。它也违背了这个方法的名字——它不是增加一本书,而是设置了一本书的列表。考虑一下这里感谢NKOI,将尝试。
// at the top of the test fixture
using Moq.Protected;

// in the test
var mock = new Mock<Invitation> { CallBase = true };

// if you need argument matching, you MUST use ItExpr rather than It
// planning on improving this for vNext
mock.Protected()
    .Setup<Book>("AddBook", ItExpr.IsAny<Book>());