Использование Moq для установки любой по любому ключу и значению - PullRequest
11 голосов
/ 09 июня 2011

В конце вопроса: При использовании Moq для установки индексаторов в C # возникла проблема, из-за которой кто-то выделил проблему, которая также возникла у меня. Но они не нашли решения.

В частности, я пытаюсь использовать универсальный It.IsAny<string> в качестве сопоставителя для ключа и задаю значение с помощью It.IsAny<object>. При доступе через индекс и установке значения оно никогда не совпадает и не обращается к моему методу обратного вызова. И поэтому мои модульные тесты не пройдены.

var stateTable = new HashTable;
var httpSession = new Mock<HttpSessionStateBase>();

//works via httpSession.Add(key, value);
httpSession.Setup(x => x.Add(It.IsAny<string>(), It.IsAny<object>()))
    .Callback((string index, object value) => {
        var i = index;
        var v = value;

            stateData[i] = v;
    });

//does not work via httpSession[key] = value;
httpSession.SetupSet(x => x[It.IsAny<string>()] = It.IsAny<object>())
    .Callback( (string index, object value) => {
        var i = index;
        var v = value;

        stateData[i] = v;
});

Я использую Moq 4.0.10827

Ответы [ 3 ]

8 голосов
/ 09 июня 2011

По моему опыту, это никогда не работает, вы не можете использовать It.IsAny в качестве сопоставителя в выражении индексатора.Однако это будет соответствовать, если вы поместите конкретное значение в индексатор.Например, работает следующее:

httpSession.SetupSet(x => x["someValue"] = It.IsAny<object>())
    .Callback( (string index, object value) => {
        var i = index;
        var v = value;

        stateData[i] = v;
});
2 голосов
/ 02 августа 2011

Это то, что я сделал, чтобы проверить чтение.

_httpSessionStateBaseMock.VerifySet(x => x["keyname"] = It.IsAny<YourObject>(), Times.Once());

для операций чтения, которые я только что сделал с

_httpSessionStateBaseMock.Verify(x => x["keyname"],Times.Once());
0 голосов
/ 05 июня 2013

Мне это не нравится, но я смог обойти это, используя новый класс наследования. Затем я перезаписываю индексатор и вызываю виртуальный метод, который можно смоделировать.

public class HttpSessionStateBaseProxy : HttpSessionStateBase
{
    public virtual void SetItem(string key, object value)
    {
        base[key] = value;
    }
    public override object this[string name]
    {
        get
        {
            return base[name];
        }
        set
        {
            SetItem (name, value);
        }
    }

}

и насмешка выполняется:

Mock<HttpSessionStateBaseProxy> Session = new Mock<HttpSessionStateBaseProxy>(MockBehavior.Loose);
Session.CallBase = true;
Session.Setup(x => x.SetItem(It.IsAny<string>(),It.IsAny<object>()))
        .Callback<string,object>((string index, object value) =>
        {
            if (!this.SessionItems.Contains(index)) this.SessionItems.Add(index, value);
            else this.SessionItems[index] = value;


        });

        Session.Setup(s => s[It.IsAny<string>()]).Returns<string>(key =>
        {

            return this.SessionItems[key];

        });
...