c#模拟受保护的内部虚函数,输入为对象
我正在测试一个公共API,但是在内部,我的API调用了一个带有签名的函数,比如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函数或者直
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>());