1

我正在尝试提供一个可以帮助我测试的模拟:

ClaimsPrincipal princple = Thread.CurrentPrincipal as ClaimsPrincipal;

但是据我所知,“as”关键字返回 null 即使我可以在调试器中看到 Thread.CurrentPrincipal 是模拟。

为了测试这个理论,我整理了这个简短的演示:

void Main()
{
    var userMock = new Mock<IUser>();
    userMock.Setup(w => w.UserId).Returns(1);

    var user = userMock.Object as User;

    user.Dump(); // null

}

public interface IUser
{
    int UserId { get; set; }
}

public class User : IUser
{
    public int UserId { get; set; }
}

如何为在后台使用 as 关键字的代码提供最小起订量?

据我了解,也许我需要为代理提供一种回退方式?

我有点意识到这是不可能的,但想知道人们解决这个问题的方法是什么。

4

2 回答 2

3

当你创建模拟

var userMock = new Mock<IUser>();

然后 Moq 动态创建实现IUser接口的类。User该类与该接口的其他实现(如类)无关。这就是为什么模拟对象是IUser但它不是User

var user = userMock.Object as User; // will be null
于 2014-02-25T14:49:29.797 回答
2

我想我已经找到了解决方法,我知道我应该模拟接口而不应该模拟具体的类,但这可能必须在我可以重构依赖项之前完成。

诀窍是模拟混凝土class Mock<User>()并使用As<IUser>()模拟属性等。

void Main()
{
    var userMock = new Mock<User>();
    userMock.As<IUser>().Setup(w => w.UserId).Returns(1);

    var user = userMock.Object as User;

    user.Dump(); // not null
}

public interface IUser
{
    int UserId { get; set; }
}

public class User : IUser
{
    public int UserId { get; set; }
}

我想我错过了尝试这个,因为我过去一直在嘲笑界面。

于 2014-02-25T15:01:35.360 回答