[NSub說明書] Page 2 - 傳入參數 與 回傳值

NSubstitute 傳入參數 與 回傳值 的相關設定
範例程式碼放在 GitHub

前言

方法的傳入參數與回傳值 在NSub可以做多樣化的設定,這篇就是來看如何設定

回傳值的設定

先介紹回傳值的用法有Returns跟ReturnsForAnyArgs

用之前的範例來說明
calculator.Add(3,6).Returns(9);
傳入參數一定要是3,6 回傳才是9
如果傳入不是3,6的話就找不到批配的設定變成回傳值 型別的預設值

calculator.Add(0,0).ReturnsForAnyArgs(9);
就是回傳時不會去理會傳入參數一律回9
所以這時候的Add(0,0) 不管打啥都可以
calculator.Add(default(int), default(int)).ReturnsForAnyArgs(9);
這樣也OK
那就來看一下程式碼

        public interface ICalculator
        {
            int Add(int a, int b);
        }

        [TestMethod]
        public void NSubstituteNote1()
        {
            //arrange
            //NSubstitute會產生一個ICalculator 假的實體出來
            ICalculator calculator = Substitute.For<ICalculator>();
            //設定假的實體當傳入1,100回傳101
            calculator.Add(1, 100).Returns(101);
            var expected = 101;

            //act
            var actual = calculator.Add(1, 100);

            //assert
            Assert.AreEqual(expected, actual);

            //act 傳入是5,100 所以回傳不會是101
            actual = calculator.Add(5, 100);
            Assert.AreNotEqual(expected, actual);
            //沒設定的參數 會是int的預設值
            Assert.AreEqual(0, actual);
        }

        [TestMethod]
        public void NSubstituteNote2()
        {
            //arrange
            //NSubstitute會產生一個ICalculator 假的實體出來
            ICalculator calculator = Substitute.For<ICalculator>();
            //設定假的實體不管任何參數都回傳222
            calculator.Add(default(int), default(int))
                      .ReturnsForAnyArgs(222);
            var expected = 222;
 
            //act
            var actual = calculator.Add(1, 2);
            var actual2 = calculator.Add(3, 3);
            var actual3 = calculator.Add(19, 200000);

            //assert
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(expected, actual2);
            Assert.AreEqual(expected, actual3);
        }

傳入參數的設定

傳入參數正常的寫法
calculator.Add(3,6).Returns(9);
就是要3,6符合才有作用
那我想要任意數字都可以的話呢
可以用Arg.Any<型別>()
calculator.Add(Arg.Any<int>(), Arg.Any<int>()).Returns(333);
這樣就是不管傳入參數是多少 回傳都是333
calculator.Add(Arg.Any<int>(), 6).Returns(333);
這就第一個參數都可以,第二個一定要是6 才會回傳333

那我想要指定的條件
可以用Arg.Is<型別>()
calculator.Add(Arg.Is<int>(x => x > 3), Arg.Is<int>(x => x < 20)).Returns(333);
這樣第一個參數要大於3 第二個參數要小於20 回傳才是333
那就來看一下程式碼

        [TestMethod]
        public void NSubstituteNote3()
        {
            //arrange
            //NSubstitute會產生一個ICalculator 假的實體出來
            ICalculator calculator = Substitute.For<ICalculator>();
            //設定假的實體不管任何參數都回傳333
            calculator.Add(Arg.Any<int>(), Arg.Any<int>())
                      .Returns(333);
            var expected = 333;

            //act
            var actual = calculator.Add(18, 42);
            var actual2 = calculator.Add(13,23);
            var actual3 = calculator.Add(519, 50000);

            //assert
            Assert.AreEqual(expected, actual);
            Assert.AreEqual(expected, actual2);
            Assert.AreEqual(expected, actual3);
        }

        [TestMethod]
        public void NSubstituteNote4()
        {
            //arrange
            //NSubstitute會產生一個ICalculator 假的實體出來
            ICalculator calculator = Substitute.For<ICalculator>();
            //設定假的實體不管任何參數,跟6 都回傳333
            calculator.Add(Arg.Any<int>(),6)
                      .Returns(333);
            var expected = 333;

            //act
            var actual = calculator.Add(5,6);

            //assert
            Assert.AreEqual(expected, actual);

            //不符合條件
            var actual3 = calculator.Add(519, 50000);
            Assert.AreNotEqual(expected, actual3);
        }

        [TestMethod]
        public void NSubstituteNote5()
        {
            //arrange
            //NSubstitute會產生一個ICalculator 假的實體出來
            ICalculator calculator = Substitute.For<ICalculator>();
            //設定假的實體大於3,跟小於20 都回傳333
            calculator.Add(Arg.Is<int>(x => x > 3), Arg.Is<int>(x => x < 20))
                      .Returns(333);
            var expected = 333;

            //act
            var actual = calculator.Add(4,19);

            //assert
            Assert.AreEqual(expected, actual);

            //不符合條件
            var actual3 = calculator.Add(3, 20);
            Assert.AreNotEqual(expected, actual3);
        }
可以自訂傳入參數與回傳值 就可以模擬任何情境

結語

接下來會介紹屬性

 

如果內容有誤請多鞭策謝謝