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>
這樣就是不管傳入參數是多少 回傳都是333
calculator.Add(Arg.Any<int>
樣
這就第一個參數都可以,第二個一定要是6 才會回傳333
那我想要指定的條件呢
可以用Arg.Is<型別>()
calculator.Add(Arg.Is<int>
這樣第一個參數要大於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);
}
結語
接下來會介紹屬性
如果內容有誤請多鞭策謝謝