.net 在这种情况下我可以使用最小起订量吗?

.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.

对于使用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.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(我只相信终极版)
  • (不是免费版本)

在代码段中没有if-st对象的用法,不过动态代理库在这种情况下可能会有所帮助谢谢Jani。。更正了代码片段。解决这个问题是我写这篇文章的初衷。我用测试中的代码更新了原始帖子。当我从BCL重写基类方法时,如何围绕这一点进行设计?
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; } }
}