代码之家  ›  专栏  ›  技术社区  ›  Chris Marisic

MOQ如何正确模拟仅设置属性

  •  14
  • Chris Marisic  · 技术社区  · 14 年前

    处理接口的正确方法是什么?只公开带有moq的set属性?以前我已经添加了另一个访问器,但是这个访问器在我的域中使用了太多随机的内容。 throw new NotImplementedException() 全部陈述。

    我只想做一些简单的事情,比如:

    mock.VerifySet(view => view.SetOnlyValue, Times.Never());

    但这会产生编译错误 The property 'SetOnlyValue' has no getter

    2 回复  |  直到 12 年前
        1
  •  18
  •   Ruben Bartelink    14 年前
    public class Xyz
    {
        public virtual string AA { set{} }
    }
    public class VerifySyntax
    {
        [Fact]
        public void ThisIsHow()
        {
            var xyz = new Mock<Xyz>();
            xyz.Object.AA = "bb";
            // Throws:
            xyz.VerifySet( s => s.AA = It.IsAny<string>(), Times.Never() );
        }
    }
    public class SetupSyntax
    {
        [Fact]
        public void ThisIsHow()
        {
            var xyz = new Mock<Xyz>();
            xyz.SetupSet( s => s.AA = It.IsAny<string>() ).Throws( new InvalidOperationException(  ) );
            Assert.Throws<InvalidOperationException>( () => xyz.Object.AA = "bb" );
        }
    }
    
        2
  •  2
  •   Ulf Åkerstedt    12 年前

    谢谢Ruben!

    为了帮助使用vb.net的人,这是vb.net中的相同代码:

    Public Interface Xyz
        WriteOnly Property AA As String
    End Interface
    Public Class VerifySyntax
        <Fact()>
        Public Sub ThisIsHow()
            Dim xyz = New Mock(Of Xyz)
            xyz.Object.AA = "bb"
            ' Throws:
            xyz.VerifySet(Sub(s) s.AA = It.IsAny(Of String)(), Times.Never())
        End Sub
    End Class
    Public Class SetupSyntax
        <Fact()>
        Public Sub ThisIsHow()
            Dim xyz = New Mock(Of Xyz)
            xyz.SetupSet(Sub(s) s.AA = It.IsAny(Of String)()).Throws(New InvalidOperationException())
            Assert.Throws(Of InvalidOperationException)(Sub() xyz.Object.AA = "bb")
        End Sub
    End Class
    

    重要的是你 不能 使用单行 功能 lambda,因为它将被解释为返回值的表达式,而不是您在后面的赋值语句。 这是因为vb.net不仅在赋值时使用单等号,而且在相等比较时也使用单等号,因此尝试这样做

            xyz.VerifySet(Function(s) s.AA = It.IsAny(Of String)(), Times.Never())
    

    将被解释为s.a a值和it.isany(of string)()的布尔比较,从而调用getter,这将再次导致编译错误。 相反,您要使用 附属的 lambda(或可能是多行函数lambda)。

    但是,如果属性上有getter,函数lambda仍然可以工作。