Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq如何正确模拟仅设置属性_C#_.net_Moq - Fatal编程技术网

C# Moq如何正确模拟仅设置属性

C# Moq如何正确模拟仅设置属性,c#,.net,moq,C#,.net,Moq,使用Moq处理仅公开集属性的接口的正确方法是什么?以前,我添加了另一个访问器,但这已经渗透到我的域中太远了,贯穿始终的随机抛出new NotImplementedException()语句 我只想做一些简单的事情,比如: mock.VerifySet(view=>view.SetOnlyValue,Times.Never()) 但这会产生编译错误,即属性“SetOnlyValue”没有getter公共类Xyz public class Xyz { public virtual strin

使用Moq处理仅公开集属性的接口的正确方法是什么?以前,我添加了另一个访问器,但这已经渗透到我的域中太远了,贯穿始终的随机
抛出new NotImplementedException()
语句

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

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

但这会产生编译错误,即属性“SetOnlyValue”没有getter

公共类Xyz
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" );
    }
}
{ 公共虚拟字符串AA{set{}} } 公共类验证语法 { [事实] 公共无效ThisIsHow() { var xyz=新的Mock(); xyz.Object.AA=“bb”; //抛出: xyz.VerifySet(s=>s.AA=It.IsAny(),Times.Never()); } } 公共类设置语法 { [事实] 公共无效ThisIsHow() { var xyz=新的Mock(); SetupSet(s=>s.AA=It.IsAny()).Throws(新的InvalidOperationException()); Assert.Throws(()=>xyz.Object.AA=“bb”); } }
谢谢鲁本

为了帮助有VB.Net问题的人,这与VB.Net中的代码相同:

公共接口Xyz
WriteOnly属性AA作为字符串
端接口
公共类验证语法
公共Sub ThisIsHow()
Dim xyz=新的模拟(xyz的)
xyz.Object.AA=“bb”
“抛出:
xyz.VerifySet(Sub(s)s.AA=It.IsAny(字符串的)(),Times.Never())
端接头
末级
公共类设置语法
公共Sub ThisIsHow()
Dim xyz=新的模拟(xyz的)
xyz.SetupSet(Sub(s)s.AA=It.IsAny(字符串的)()。抛出(新的InvalidOperationException())
Assert.Throws(属于InvalidOperationException)(Sub()xyz.Object.AA=“bb”)
端接头
末级
这里很重要的一点是,您不能使用单行函数lambda,因为这将被解释为返回值的表达式,而不是您所追求的赋值语句。 这是因为VB.Net不仅使用单个等号进行赋值,而且还用于相等比较,因此尝试这样做

xyz.VerifySet(函数s.AA=It.IsAny(字符串的)(),Times.Never())
将被解释为s.AA值和It.IsAny(字符串的)的布尔比较,从而调用getter,这将再次导致编译错误。 相反,您希望使用lambda(或者可能是多行函数lambda)


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

我很困惑,如果编译器发现您试图在只写属性上调用getter,那么测试的目的是什么?我确信我在这里遗漏了一些东西,也许是OP?@Igor Zevaka和其他人的澄清:
view=>view.SetOnlyValue'生成的
属性“SetOnlyValue”没有getter”。这是因为这段代码被解释为对getter的调用。在读写情况下,
VerifySet
遍历表达式并找出所需要的是对属性setter的期望。在只写的情况下,这会导致编译器错误。我们需要假设OP在这里并不愚蠢,也不想让自己工作,而是问“我如何避免做额外的垃圾”。哦,我明白了。所以,这是关于在moq中设置一个验证,它不依赖于需要getter的属性,对吗?@Ruben不,自从你指出它是一个只设置的属性以来,就没有任何意义了,我以前已经看过了。我错了,嗨。我已经看完了这个答案,只是想再检查一下。因此,如果我有一个setter-only属性,并且我不关心该值,我就不能使用
VerifySet(v=>v.SetOnlyProp)
。相反,我必须使用
VerifySet(v=>v.SetOnlyProp=It.IsAny())
。是吗?+1-读过这篇文章后,我删除了我的答案,因为这似乎是OP想要的。@Lee:酷,ta(我知道我也读了这个问题!)谢谢Ruben,我永远不会随机决定把它放在一行旁边。我的任何表达式都会在resharper说的一行旁边,这是一个编译错误!我知道你可以专门测试设置,但我从来没有想过这会改变SetupSet调用的方法重载,从而绕过编译错误。@Chris Marisic:我不确定我是否解释得很清楚。我的意思是表达式
view=>view.SetOnlyValue
调用getter,而类似
view=>view.SetOnlyValue=0
的东西将调用setter。为了避免使用
It
东西,
Setup/VerifySet
上下文中的第一个样式(getter)被解释为引用setter,即使底层代码是getter调用。我觉得你把我先前的回答解释为暗示,这是没有魔力的。