.net 在这种情况下我可以使用最小起订量吗?
对于使用Moq模拟此对象,我有什么可能的解决方法。返回的错误消息是: “非虚拟(在VB中可重写)成员上的设置无效:p=>p.Certificate.SubjectName.Name”.net 在这种情况下我可以使用最小起订量吗?,.net,unit-testing,mocking,moq-3,.net,Unit Testing,Mocking,Moq 3,对于使用Moq模拟此对象,我有什么可能的解决方法。返回的错误消息是: “非虚拟(在VB中可重写)成员上的设置无效:p=>p.Certificate.SubjectName.Name” var st=new Mock(); st.SetupGet(p=>p.Certificate.SubjectName.Name)。返回(“test1”); var目标=新X509IssuerNameRegistry(“测试1”、“测试2”); var-actual=target.GetIssuerName(st.
var st=new Mock();
st.SetupGet(p=>p.Certificate.SubjectName.Name)。返回(“test1”);
var目标=新X509IssuerNameRegistry(“测试1”、“测试2”);
var-actual=target.GetIssuerName(st.Object);
AreEqual(“test1”,实际,“实际安全令牌不等于预期的安全令牌”);
注意:我试图嘲笑你。
下面是正在测试的类:
公共类X509IssuerNameRegistry:IssuerNameRegistry
{
只读列表_trustedSubjectNames=新列表()
公共X509IssuerNameRegistry(参数字符串[]trustedSubjectNames)
{
_trustedSubjectNames=新列表(trustedSubjectNames);
}
公共重写字符串GetIssuerName(SecurityToken SecurityToken)
{
var x509Token=securityToken作为X509SecurityToken;
如果(x509Token!=null)
{
if(_trustedSubjectNames.Contains(x509Token.Certificate.SubjectName.Name))
{
返回x509Token.Certificate.SubjectName.Name;
}
}
抛出新的SecurityTokenException(“不受信任的发行人”);
}
}
这方面有什么工作循环(使用Moq)吗?或者我应该找另一个模拟框架来完成这项工作吗 您可以寻找一些框架,允许您“破解”无法简单模仿的代码(即,不包含虚拟方法/不是接口),但这可能是杀伤力过大(有些选项不是免费的,例如) 更简单的方法可能是抽象
X509SecurityToken
,例如:
interface ISecurityToken
{
string SubjectName { get; }
// ...
}
然后,实现一个包装器,该包装器还实现上面指定的接口:
class SecurityToken : ISecurityToken
{
X509SecurityToken token;
public SecurityToken(X509SecurityToken token)
{
this.token = token;
}
public string SubjectName { get { return token.SubjectName.Name; } }
}
然后,在整个代码中,您应该使用ISecurityToken
接口,而不是X509SecurityToken
,这将非常容易模拟。否,Moq(就像任何继承类一样)不能覆盖非虚拟方法,因此除非您可以将名称作为虚拟属性(通过更改或包装类),它不能被Moq嘲笑
如果可能的话,我建议您将您的属性更改为虚拟,因为这将允许您使用任何模拟框架。据我所知,只有3个可以模拟非虚拟方法,没有一个是免费的
- 这是VS2012(我只相信终极版)
- (不是免费版本)
interface ISecurityToken
{
string SubjectName { get; }
// ...
}
class SecurityToken : ISecurityToken
{
X509SecurityToken token;
public SecurityToken(X509SecurityToken token)
{
this.token = token;
}
public string SubjectName { get { return token.SubjectName.Name; } }
}