我正在测试一个公共API,但是我的API内部正在调用一个带有签名的函数,如
protected internal virtual void AddBook(Book book)
{
if (null !=book)
bookList= book;
}
bookList也被定义为
public virtual BookInformation bookList{ get; protected internal set; }
我需要设置这个bookList。我可以使用AddBook函数或直接访问bookList。 bookList也被定义为" protected internal set
"。
我试过
var mockModule = new Mock<myModule> { CallBase = true };
mockModule.Protected()
.Setup<Book>("AddBook", book);
但是我得到错误&#34; AddBook&#34;不存在。
任何想法我都缺少什么?
更新 我被迫截止日期,所以我最终嘲笑这个班级。这解决了我现在的问题。
答案 0 :(得分:0)
当您编写.Setup<Book>("AddBook", book);
时,这会模拟返回类型为Book
的方法,但您的返回类型为void。这就是您收到AddBook
不存在的错误的原因。您需要拨打.Setup("AddBook", book)
。
要模拟受保护的成员,您必须首先在测试夹具的顶部包含以下内容:
using Moq.Protected;
然后在模拟上调用Protected()
,之后您可以使用通用Setup<>
和您方法的返回类型。
var mock = new Mock<MyClass>();
mock.Protected()
.Setup<int>("MyProtectedGetIntMethod")
.Returns(1);
如果方法返回void,则使用非泛型Setup()
。
答案 1 :(得分:0)
如果你需要参数匹配,你必须使用
ItExpr
而不是It
// 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>());