Moq VerifySet завершается ошибкой при использовании установщика свойства интерфейса - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть следующий код в моем тесте Nunit:

    [Test]
    public void SmtpSend_UsingSystemCredentials_SetsSmtpClientCredentials()
    {
        const string smtppwd = "smtppwd";
        const string smtpuser = "smtpuser";
        const string smtphost = "smtphost";
        const int smtpport = 333;

        _emailManager.Setup(x => x.ValidateSmtpSettings()).Returns(true);
        _emailTransportConfig.SetupGet(x => x.SmtpPassword).Returns(smtppwd);
        _emailTransportConfig.SetupGet(x => x.SmtpUsername).Returns(smtpuser);
        _emailTransportConfig.SetupGet(x => x.SmtpHost).Returns(smtphost);
        _emailTransportConfig.SetupGet(x => x.SmtpPort).Returns(smtpport);            
        _smtpClient.SetupAllProperties();

        _smtpHandler.Send(null, "from@test.com", "to@test.com", "subject", "body", true);
        _smtpClient.VerifySet(x => x.Port = smtpport);
        _smtpClient.VerifySet(x => x.Host = smtphost);

        // Todo Why is this not working?
        _smtpClient.VerifySet(x => x.Credentials = new NetworkCredential(smtpuser, smtppwd));
    }

Я вижу падение кода в этой функции:

private void SetSystemSmtpAccountSettings()
    {           
        _smtpClient.Credentials = new NetworkCredential
        {
            UserName = _emailTransportConfig.SmtpUsername,
            Password = _emailTransportConfig.SmtpPassword
        };
        _smtpClient.Host = _emailTransportConfig.SmtpHost;
        _smtpClient.Port = _emailTransportConfig.SmtpPort;
    }

Но я не могу понять, почему происходит сбой вызова VerifySet.

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Ваш пример кода может использовать некоторые пояснения, но я полагаю, что ваша проблема заключается в попытке проверки по экземпляру new NetworkCredential, который не является фактическим экземпляром, установленным в тестируемом методе, следовательно, ошибка проверки. Кажется, вы пытаетесь проверить, правильно ли указаны имя пользователя и пароль в свойстве Credentials. Этот тест на основе состояния легче проверить с помощью пары утверждений:

Assert.IsNotNull(_smtpClient.Credentials);
Assert.AreEqual(_smtpClient.Credentials.UserName, smtpuser);
Assert.AreEqual(_smtpClient.Credentials.Password, smtppwd);
1 голос
/ 28 ноября 2011

Как сказал @Daz Lewis, ваш VerifySet проверяет другой экземпляр. Вместо этого попробуйте использовать It.Is с выражением соответствия:

_smtpClient.VerifySet(x => x.Credentials = It.Is<NetworkCredential>(c => c.UserName == smtpuser && c.Password == smtppwd));
0 голосов
/ 11 марта 2013

У меня похожая ситуация, но я использую фабрику, поэтому класс, которому принадлежат учетные данные, является ложным.

mockCreate = new Mock<IWebRequestCreate>();
mockRequest = new Mock<WebRequest>();
mockCreate.Setup(x => x.Create(It.IsAny<Uri>()))
                .Returns(mockRequest.Object);
webrequest = new HTTPRequestFactory(mockCreate.Object);
mockRequest.SetupProperty(mr => mr.Credentials);
mockRequest.SetupProperty(mr => mr.Credentials.UserName);
mockRequest.SetupProperty(mr => mr.Credentials.Password);

//setup username and password and send to factory
WebResponse response = webrequest.GetWebResponse(testURI);
mockCreate.VerifyAll();
mockRequest.VerifySet(mr => mr.Credentials = It.Is<NetworkCredential>(c => c.UserName == "user" && c.Password == "password"));
Assert.AreEqual("user", mockRequest.Object.Credentials.UserName);
Assert.AreEqual("user", mockRequest.Object.Credentials.Password);

adrifts ответ работает, Daz не компилируется.Любые намеки на то, где искать, чтобы узнать больше о том, почему?IntelliSense говорит, что это потому, что ICredentials не имеет определения для UserName или Password.

...