Ласкаво просимо до dev.net.ua Увійти | Приєднатися | Допомога | Увійти Live ID
в Пошук

usarskyy

Перевірка параметрів у TypeMock.NET

Не так давно Mike Chaliy опублікував пост про перевірку параметрів за допомогою Rhino.Mocks. Так як мені довелось трохи попрацювати з TypeMock.NET, то я поцікавився у автора чи не знає він як реалізувати подібну штуку там. Нажаль Mike Chaliy дав негативну відповідь :( тому прийшлось розбиратись самотужки.

В результаті виявилось, що у TypeMock.NET це реалізовується набагато простіше:

    public class SomeClass
    {
        public int TestMethod(int x, string y)
        {
            throw new NotImplementedException("TestMethod(int, string) is not implemented");
        }
    }
    [TestFixture]
    [ClearMocks]
    public class Tests
    {
        [Test]
        [VerifyMocks]
        public void FirstTest()
        {
            SomeClass s = new SomeClass();
            using (RecordExpectations recorder = RecorderManager.StartRecording())
            {
                recorder.ExpectAndReturn(s.TestMethod(1, "2"), 10).RepeatAlways();
                recorder.CheckArguments(Check.Not(-1, "'x'-parameter can't be less than 'zero'"), Check.NotNull("'y'-parameter can't be null"));
            }
            Assert.AreEqual(10, s.TestMethod(1, "2"));
            Assert.AreEqual(10, s.TestMethod(-1, null));
           
        }
    }


Все ніби і класно, але щось підказує, що має бути "ложка дьогтю"... і імя цій ложці - "ліцензія"! :( Іншими словами, код приведений вище буде працювати тільки після покупки Professional або Enterprise ліцензії. А "бідним" студентам прийдеться користуватись "стандартним" набором можливостей:

    [TestFixture]
    public class Tests
    {
        [Test]
        public void SecondTest()
        {
            Mock sc = MockManager.MockAll(typeof(SomeClass));
   
        sc.AlwaysReturn("TestMethod", 10).Args(Check.Not(-1,
"'x'-parameter can't be less than 'zero'"),
Check.NotNull("'y'-parameter can't be null"));
            SomeClass s = new SomeClass();
            Assert.AreEqual(10, s.TestMethod(1, "2"));
            Assert.AreEqual(10, s.TestMethod(-1, null));
        }
    }



>> UPDATE

Тут мене справедливо "ткнули носом" в той факт, що я пропустив важливе слово "Callback" в кінці теми минулого поста від Mike Chaliy. Зараз я постараюсь виправитись і для повноти картини додам ще один код тесту:

    [Test]
    public void ThirdTest()
    {
        Mock sc = MockManager.MockAll(typeof(SomeClass));
        SomeClass s = new SomeClass();
        sc.AlwaysReturn("TestMethod", 10).Args(
                                    new ParameterCheckerEx(delegate (ParameterCheckerEventArgs e)
                                    {
                                        if(((int)e.ArgumentValue) < 0)
                                        {
                                            e.FailureMessage = "First param can't be less then zero";
                                            return false;
                                        }
                                        return true;
                                    }),
                                    new ParameterCheckerEx(delegate (ParameterCheckerEventArgs e)
                                    {
                                        if (e.ArgumentValue == null)
                                        {
                                            e.FailureMessage = "Second param can't be null";
                                            return false;
                                        }
                                        return true;
                                    }));
       
        Assert.AreEqual(10, s.TestMethod(1, "2"));
        Assert.AreEqual(10, s.TestMethod(-1, null));
    }


От тепер справді можна порівнювати :)
Опубліковані Thursday, May 22, 2008 3:08 PM від usarskyy
Помічено як: ,

Коментарі

 

Mike Chaliy сказав:

Я тут перклав ваш другий приклад на Rhino.Mocks.

.Constraints(

new PredicateConstraint<SourceAnchor>(

anchor =>

{

Assert.IsNotNull(anchor, "SourceAnchor should not be null");

    Assert.AreEqual(sourceId, anchor.SourceId, "Anchor should have predefined source ID");

Assert.AreEqual(discoveryUri, anchor.DiscoveryUri, "Anchor should have predefined URI");

// Always return true

return true;

}

)

)

Майже нема різниці, за виключенням того що рішення від Rhino.Mocks повністю типізоване ;). Хоча чесно кажучи в Type.Mock.Net теж повинно бути все типізоване. Якщо ж ні, то заімплментувати це буде дуже легко.

May 22, 2008 10:41 AM
 

Mike Chaliy сказав:

В будь якому випадку добре що ми тут позмагались ;), адже тепер безкоштовно знаємо про продукти конкурентів ;)

May 22, 2008 10:45 AM
 

usarskyy сказав:

повністю згоден ;)

для мене в цій ситуації подвійна користь - я до цього часу взагалі не знав як перевіряти вхідні параметри :)

May 23, 2008 12:24 AM
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.