Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 你将如何测试它?有多少个测试?_C#_Unit Testing - Fatal编程技术网

C# 你将如何测试它?有多少个测试?

C# 你将如何测试它?有多少个测试?,c#,unit-testing,C#,Unit Testing,我有这个类(更多的是伪代码) 现在我的问题是。您会在GetLoginsThaatCanRunAction方法中为每个联合调用编写一个测试吗? 或者,我编写一个测试并断言该方法返回从GetLoginsThatCanCallAction内部调用的所有方法返回的登录名就足够了 我有理由这样做。但也许有人会说服我继续下去,或者采用另一种解决方案 编辑: 我想我的问题不清楚:我想问你是否愿意写这个测试 var pd = new ProcessData() pd.ProcessOwner = "Owner

我有这个类(更多的是伪代码)

现在我的问题是。您会在GetLoginsThaatCanRunAction方法中为每个联合调用编写一个测试吗? 或者,我编写一个测试并断言该方法返回从GetLoginsThatCanCallAction内部调用的所有方法返回的登录名就足够了

我有理由这样做。但也许有人会说服我继续下去,或者采用另一种解决方案

编辑: 我想我的问题不清楚:我想问你是否愿意写这个测试


var pd = new ProcessData()
pd.ProcessOwner = "Owner";
var r = new Roles(processData)
SetupSoThatCallsForPeopleThatCanCallActionWillReturn("Joe");
SetupSoThatCallForAdministratorsWillReturn("Administrator");

var logins = r.GetLoginsThatCanCallAction("some action");

Assert.That(logins, Contains("Owner");
Assert.That(logins, Contains("Joe");
Assert.That(logins, Contains("Administrator");


或者你会把它分成3个独立的测试,每个测试中有一个断言吗?

你应该只使用测试单元的公共API。您的单元有一个公共方法
GetLoginsThatCanCallAction
。不管这个方法是调用其他方法,还是作为一个大方法实现。这是一个实现细节。真正重要的是此方法是否与依赖项正确通信并返回预期结果:

// Arrange
Mock<IProcessData> processData = new Mock<IProcessData>();
processData.Setup(d => d.ProcessOwner).Returns(new[] { "Bob" });
var expected = new []{ "Bob", "Joe" };
// Act
var actual = roles.GetLoginsThatCanCallAction("Drink");
// Assert
processData.VerifyGet(d => d.ProcessOwner); // verify communication
CollectionAssert.AreEquivalent(expected, actual); // verify result
//排列
Mock processData=new Mock();
Setup(d=>d.ProcessOwner).Returns(new[]{“Bob”});
预期var=new[]{“Bob”,“Joe”};
//表演
var actual=roles.GetLoginsThatCanCallAction(“饮料”);
//断言
processData.VerifyGet(d=>d.ProcessOwner);//验证通信
集合资产相当于(预期、实际);//验证结果

您应该只使用测试单元的公共API。您的单元有一个公共方法
GetLoginsThatCanCallAction
。不管这个方法是调用其他方法,还是作为一个大方法实现。这是一个实现细节。真正重要的是此方法是否与依赖项正确通信并返回预期结果:

// Arrange
Mock<IProcessData> processData = new Mock<IProcessData>();
processData.Setup(d => d.ProcessOwner).Returns(new[] { "Bob" });
var expected = new []{ "Bob", "Joe" };
// Act
var actual = roles.GetLoginsThatCanCallAction("Drink");
// Assert
processData.VerifyGet(d => d.ProcessOwner); // verify communication
CollectionAssert.AreEquivalent(expected, actual); // verify result
//排列
Mock processData=new Mock();
Setup(d=>d.ProcessOwner).Returns(new[]{“Bob”});
预期var=new[]{“Bob”,“Joe”};
//表演
var actual=roles.GetLoginsThatCanCallAction(“饮料”);
//断言
processData.VerifyGet(d=>d.ProcessOwner);//验证通信
集合资产相当于(预期、实际);//验证结果

有趣的话题,您的问题是,在开发了一些代码之后,您正试图编写一个测试用例。每次工会电话我都要做一次测试。原因是您想测试从所有方法返回的值,还是想测试在不同的假设下每个方法都将返回登录

对我来说,更重要的是知道每种方法都将基于不同的用例返回登录,而不是返回通过/失败的一般测试


我希望这是有意义的。

有趣的话题,您的问题是,在开发了一些代码之后,您正试图编写一个测试用例。每次工会电话我都要做一次测试。原因是您想测试从所有方法返回的值,还是想测试在不同的假设下每个方法都将返回登录

对我来说,更重要的是知道每种方法都将基于不同的用例返回登录,而不是返回通过/失败的一般测试


我希望这是有意义的。

我将为模拟外部对象编写一个测试。从您的示例中,这可能意味着模拟
Union
调用。原因是,当我编写这段代码时,我并不关心
Union
中使用的逻辑。(我有一些案例甚至还没有写出来)

如果工会呼叫行为可以改变(即抛出异常),我将对每一个进行测试。然而,我会让我的测试套件为我生成这些测试用例,而不是试图手工编写它们

您担心的是
GetLoginsThatCanCallAction
的行为是否正确。您还希望控制
联合
调用返回的内容

也就是说,您还希望有一个自动测试,该测试执行
getloginsthatchcancallaction
中使用的整个过程,以便验证在单元测试中模拟的类之间的连接。除非不可能自己手动执行流程

另一个注意事项是,如果课程很难测试。这是一种代码味道,您的设计并没有像它可能的那样模块化


如果您需要模拟类的内部方法来测试函数,我也会避免这样做。这表明您的类中隐藏着另一个类。您的类正在做不止一件事

我将为模拟外部对象编写一个测试。从您的示例中,这可能意味着模拟
Union
调用。原因是,当我编写这段代码时,我并不关心
Union
中使用的逻辑。(我有一些案例甚至还没有写出来)

如果工会呼叫行为可以改变(即抛出异常),我将对每一个进行测试。然而,我会让我的测试套件为我生成这些测试用例,而不是试图手工编写它们

您担心的是
GetLoginsThatCanCallAction
的行为是否正确。您还希望控制
联合
调用返回的内容

也就是说,您还希望有一个自动测试,该测试执行
getloginsthatchcancallaction
中使用的整个过程,以便验证在单元测试中模拟的类之间的连接。除非不可能自己手动执行流程

另一个注意事项是,如果课程很难测试。这是一种代码味道,您的设计并没有像它可能的那样模块化

如果您需要模拟类的内部方法来测试函数,我也会避免这样做。这是一个符号t