Как правильно смоделировать установить только свойства - PullRequest
14 голосов
/ 18 мая 2010

Как правильно обращаться с интерфейсами, открывающими доступ только к множеству свойств с Moq? Ранее я добавил другой метод доступа, но он слишком сильно попал в мой домен со случайными throw new NotImplementedException() инструкциями по всему.

Я просто хочу сделать что-то простое, например:

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

Но это приводит к ошибке компиляции The property 'SetOnlyValue' has no getter

Ответы [ 2 ]

18 голосов
/ 18 мая 2010
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 голосов
/ 13 апреля 2012

Спасибо, Рубен!

И чтобы помочь кому-то с Vcha.Net, попробуйте тот же код в VB.Net: * 1003.

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

Здесь важно, что вы не можете использовать одну строку Функция лямбда, поскольку это будет интерпретироваться как выражение, которое возвращает значение, а не как оператор присваивания, который вы после. Это связано с тем, что VB.Net использует один знак равенства не только для присваивания, но и для сравнения на равенство, и поэтому пытается сделать

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

будет интерпретироваться как логическое сравнение s.AA-значения и It.IsAny (Of String) (), вызывая, таким образом, метод получения, что снова приведет к ошибке компиляции. Вместо этого вы хотите использовать Sub лямбда (или, возможно, многострочную лямбда-функцию).

Однако, если у вас есть геттер для свойства, лямбда-функция все равно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...