модульный тест с лямбда-провалом с использованием макета носорога - PullRequest
0 голосов
/ 02 декабря 2010

Если у меня есть этот тест

Expect.Call(_session.Single<Admin>(x => x.Email == userModel.Email)).Repeat.Once().Return(null);

Скажите мне

Rhino.Mocks.Exceptions.ExpectationViolationException: ISession.Single (x => (x.Email == value)(Enquete.Test.Controllers.MemberControllerTest + <> c__DisplayClassb) .userModel.Email));Ожидаемый # 1, фактический # 0.

Сбой, но если я добавлю .IgnoreArguments (), это сработает.Можно ли проверить с помощью лямбды?Если я отлаживаюсь, я вижу, что мой Email такой же.

Вот полный тест:

[Test]
        public void Register_Post_ReturnRedirectOnSuccess()
        {
            _builder.InitializeController(_controller);

            var userModel = TestHelper.CreateMemberModel();
            var returnMemberRole = "Member";
            var tempPassword = "Val1dPass";
            var member = TestHelper.CreateMember(userModel);
            var emailSubscription = "subscription@corpiq.com";
            var subjectNotification = "sujet du meessaaggee";
            var mailUseSSL = "true";
            var message = userModel.FirstName + " " + userModel.LastName + " s'est inscrit au système d'enquête en ligne, veuillez confirmer son inscription.";
            member.PasswordExpire = DateTime.Now.AddDays(-1);
            member.Phone = userModel.Phone;
            member.MemberNumber = userModel.MemberNumber;
            member.PasswordExpire = DateTime.Now.AddDays(-1);

            Expect.Call(_session.Single<Admin>(x => x.Email == userModel.Email)).Repeat.Once().Return(null);
            Expect.Call(_session.Single<Member>(x => x.Email == userModel.Email)).Repeat.Once().IgnoreArguments().Return(null);
            Expect.Call(_authService.GeneratePassword()).Repeat.Once().Return(tempPassword);
            Expect.Call(_authService.MemberRole).Repeat.Once().Return(returnMemberRole);
            Expect.Call(_authService.RegisterUser(userModel.Email, tempPassword, returnMemberRole)).Repeat.Once().Return(MembershipCreateStatus.Success);
            _session.Add(member);
            LastCall.Repeat.Once();
            _session.CommitChanges();
            LastCall.Repeat.Once();
            Expect.Call(_configHelper.GetValue("emailSubscription")).Repeat.Once().Return(emailSubscription);
            Expect.Call(_configHelper.GetValue("subjectNotification")).Repeat.Once().Return(subjectNotification);
            Expect.Call(_configHelper.GetValue("MailUseSSL")).Repeat.Once().Return(mailUseSSL);
            _mailHelper.SendMail(emailSubscription, subjectNotification, message, Convert.ToBoolean(mailUseSSL));
            LastCall.Repeat.Once();

            _mock.ReplayAll();
            var result = _controller.Register(userModel);

            _mock.VerifyAll();
            result.AssertActionRedirect().ToAction<MemberController>(c => c.RegisterSuccess());

        }

Спасибо!

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

К сожалению, лямбды в C # используют равенство ссылок, а не равенство значений. Попробуйте следующее:

Func<bool> f1 = () => true;
Func<bool> f2 = () => true;
Console.WriteLine("f1 == f2 results in " + (f1 == f2));

Угадай что? Ответ неверен.

Это также ложно для выражения ...

Expression<Func<bool>> f1 = () => true;
Expression<Func<bool>> f2 = () => true;
Console.WriteLine(f1.ToString());          // Outputs "() => True"
Console.WriteLine("a1 == a2 results in " + (f1 == f2)); // False

К сожалению, лучший способ решить эту проблему (и ее уродливость) в C # (а следовательно, и в Rhino Mocks) - использовать ToString () в выражениях и сравнить их.

Expression<Func<bool>> f1 = () => true;
Expression<Func<bool>> f2 = () => true;
Console.WriteLine(f1.ToString());        // Outputs "() => True"
Console.WriteLine("a1 == a2 results in " + (f1.ToString() == f2.ToString()));  // True

Вы должны быть осторожны с этой техникой, поскольку два выражения, "x => x" и "y => y", хотя и функционально эквивалентны, все равно будут иметь значение false из-за различных параметров. Также имейте в виду, что вы должны делать это с Expression, а не с Func или Action, чтобы этот трюк ToString () работал.

1 голос
/ 03 декабря 2010

Лямбда в вашем модульном тесте компилируется в метод уровня класса (метод внутри вашего модульного теста).Внутри вашего контроллера другая лямбда компилируется в метод уровня класса (внутри контроллера).Используются два разных метода, поэтому Rhino Mocks показывает ошибку ожидания.Подробнее здесь: http://groups.google.com/group/rhinomocks/browse_frm/thread/a33b165c16fc48ee?tvc=1

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