2017-05-30 96 views
0

我想用一个模拟对象的不同行为执行一个测试方法几(3)次。所以我可以避免用模拟对象编写多个Test方法。使用多种方法返回可能性的测试方法

守则〔实施例:

_mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>()).Returns(new objA() { TestProp="bla1" }; 
_mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>()).Returns(new objA() { TestProp="bla2" }; 
_mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>()).Returns(new objA() { TestProp="bla3" }; 

我想要做的是使用一个测试方法测试上述3点的行为。这是可能的还是我必须写3个单独的测试方法?

编辑

我发现,我必须使用TestCaseSourceAttribute。但现在我正面临另一个“问题”。当我有很多测试案例,其中一个失败时,我无法追查哪一个测试案例失败...

+1

你可以写一个方法,要么使用3种测试方法或由一个测试方法称为3倍宛若常规代码。 – juharr

+0

你的意思是我可以在一个测试方法中编写3个单独的排列,行为,断言? – Ozkan

+0

这是一种看待它的方法,但是我会将常见的Arrage,Act和Assert代码写入“helper”方法,然后调用它传入不同的mock中,这是我的建议。 Wheather你从一个Test方法中调用它,或者3取决于你。我仍然会做3个独立的测试方法,这样我就可以看到每个方法的断言/错误。 – juharr

回答

0

一些研究使我这个:https://stackoverflow.com/a/10687118/1410501

[Test, TestCaseSource(nameof(MyTestCases))] 
public void TestMethod(object obj) 
{ 

} 

private static readonly object[] MyTestCases = 
{ 
    new object { TestProp="bla1" }, 
    new object { TestProp="bla2" }, 
    new object { TestProp="bla3" }, 
}; 
2

一个方法!=一个测试。使用参数,一种方法会产生很多测试用例。例如...

[TestCase("bla1")] 
[TestCase("bla2")] 
[TestCase("bla3")] 
public void MyTest(string blaValue) 
{ 
    _mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>()) 
     .Returns(new objA() { TestProp=blaValue }; 

    // Your test code 
} 
+0

谢谢,但我的属性参数实际上不是编译时常量。这是一个对象。我想尽可能简化我的例子 – Ozkan