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

时间:2017-01-18 23:02:54

标签: c# mocking moq protected

我正在测试一个公共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;不存在。

任何想法我都缺少什么?

更新 我被迫截止日期,所以我最终嘲笑这个班级。这解决了我现在的问题。

2 个答案:

答案 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)

根据Quickstart

中的文档
  

如果你需要参数匹配,你必须使用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>());