2014-02-25 36 views
1

我试图提供一个模拟的,这将有助于我的测试:MOQ和“为”关键字

ClaimsPrincipal princple = Thread.CurrentPrincipal as ClaimsPrincipal; 
从我可以告诉

然而,“为”关键字返回空,即使我能看到在调试器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; } 
} 

我如何提供MOQ对在后台使用的关键词代码?

从我的理解或许我需要什么,以提供代理投退的方法吗?

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

回答

1

我想我已经找到工作的时候,我知道我应该嘲笑反对接口,不应该嘲笑具体类,但这可能要直到我可以重构依赖关系。

关键是要嘲笑具体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; } 
} 

我想我错过了尝试这个,因为我一直在嘲讽总是在过去的接口。

+1

我仍然认为它更好地依赖于你的代码中的IUser,但是解决方案是interesing - 用于将接口实现添加到生成的代理。我没有想到嘲讽类,然后添加接口模拟它 –

+0

是的,我同意,这取决于IUSER是在这种情况下一个更好的主意,但对于“为ClaimsPrinciple”这是“只是OK”之前,我做多一些good'ol在后台重构。 :-) –

3

当你创建模拟

var userMock = new Mock<IUser>(); 

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

var user = userMock.Object as User; // will be null 
+1

谢谢@谢谢,这就是我的想法 - 谢谢你的重申。当你遇到这种情况时,你有没有更喜欢的方法?我猜我真的不应该这样做,应该重新考虑整个区域。 –

+1

@AlexKey是的,你可以在['模拟'](https://code.google.com/p/moq/source/browse/trunk/Source/Mock.Generic.cs)的源代码自己看看吧。有方法'InitializeInstance'它创建代理类 –

+1

@AlexKey解决方法很简单 - 让你的代码依赖于界面,你是嘲讽,而不是接口实现 –