C# 单元测试的行为很奇怪-你能解释一下这个谜团吗?
这是我的测试:C# 单元测试的行为很奇怪-你能解释一下这个谜团吗?,c#,unit-testing,tdd,nunit,C#,Unit Testing,Tdd,Nunit,这是我的测试: [TestFixture] public class DisplayingPageLinks { [Test] public void Can_Generate_Links_To_Other_Pages() { //Arrange: We're going to extend the Html helper class. //It doesn't matter if the variable we use is null
[TestFixture]
public class DisplayingPageLinks
{
[Test]
public void Can_Generate_Links_To_Other_Pages()
{
//Arrange: We're going to extend the Html helper class.
//It doesn't matter if the variable we use is null
HtmlHelper html = null;
PagingInfo pagingInfo = new PagingInfo(){
CurrentPage = 2,
TotalItems = 28,
ItemsPerPage = 10
};
Func<int, String> pageUrl = i => "Page" + 1;
//Act: Here's how it should format the links.
MvcHtmlString result = html.PageLinks(pagingInfo, pageUrl);
//Assert:
result.ToString().ShouldEqual(@"<a href=""Page1"">1</a><a href=""Page2"">2</a><a href=""Page3"">3</a>");
}
}
错误似乎源于这样一个事实:返回的是2页,而不是3页
此计算中是否有错误?(回答编辑中提出的新问题。)PageLinks()
中的循环以i=1
开始,并以i
作为条件-一个经典错误关闭。:-) (回答编辑中提出的新问题。)PageLinks()
中的循环以i=1
开始,并将i
作为条件-一个典型错误导致关闭。:-)
这个计算有什么错误吗
是的,你在玩弄所涉及的类型和操作。在不知道运算符优先级的情况下,您不知道小数转换是否在除法之前应用,因此也不知道除法是十进制除法还是整数除法
使用多个语句,并明确类型。阅读
我将把这次投票看作是对更多帮助的提示。考虑这一点:输入都是整数。这个问题能在整数域中解决吗?有必要包含小数吗
这个计算有什么错误吗 是的,你在玩弄所涉及的类型和操作。在不知道运算符优先级的情况下,您不知道小数转换是否在除法之前应用,因此也不知道除法是十进制除法还是整数除法 使用多个语句,并明确类型。阅读
我将把这次投票看作是对更多帮助的提示。考虑这一点:输入都是整数。这个问题能在整数域中解决吗?有必要包含小数吗
这个计算有什么错误吗 好问题。作为正确的测试驱动设计的练习,尝试创建一个单元测试来隔离这个特定的计算。大概是这样的:
Assert.AreEqual(3, new PagingInfo {TotalItems = 4, ItemsPerPage = 9}.TotalPages);
如果这些单元测试表明函数正确地计算了输入,那么您就知道消费类一定提供了错误的输入
这里真正的问题可能是Aasmund发现的问题,但我希望这个答案能让您了解如何改进单元测试,以深入了解错误的真正来源
这个计算有什么错误吗
好问题。作为正确的测试驱动设计的练习,尝试创建一个单元测试来隔离这个特定的计算。大概是这样的:
Assert.AreEqual(3, new PagingInfo {TotalItems = 4, ItemsPerPage = 9}.TotalPages);
如果这些单元测试表明函数正确地计算了输入,那么您就知道消费类一定提供了错误的输入
这里真正的问题可能是Aasmund发现的问题,但我希望这个答案能让您了解如何改进单元测试,以深入了解错误的真正来源。就是这样!:)有趣的是,学习新东西真的会缩小你对问题的视野。感谢您的时间。+1:如前所述,循环将只执行2次。对于值1和2。当i增加到3时,循环条件失败,第三次传递从未发生。将“(int i=1;”更改为“(int i=0;@Sergio Tapia:的确-谁知道我自己多久去过那里一次.:-)顺便说一下,请参阅@StriplingWarrior关于直接测试
PaginInfo.TotalPages
,这会揭示错误在别处。就是这样!)有趣的是,学习新东西真的会缩小你对问题的视野。感谢您的时间。+1:如前所述,循环将只执行2次。对于值1和2。当i增加到3时,循环条件失败,第三次传递从未发生。把“(inti=1;”改为“(inti=0;”@Sergio Tapia:的确如此——谁知道我自己多久去过那里一次.)顺便说一句,请参阅@StriplingWarrior关于直接测试PaginInfo.TotalPages
,这会显示错误在其他地方。他已经知道,当有3个页面时,它返回2。您的测试没有显示任何内容。@David B:不,他不知道-他认为这是一个错误的假设。这个测试(希望对各种角落案例进行更多测试)会发现pagininfo.TotalPages
工作正常,因此问题一定在别处(即在循环中)大卫B:他知道他得到了一个包含2的字符串,其中应该包含3,但他问的是他的计算是否应该受到责备。这样的测试要么表明他的计算不应该受到责备,要么他应该关注PageLinks方法本身(这里就是这种情况),或者说这是错误的,他需要解决它。因为他说他正在努力学习TDD,我认为这是一个很好的机会来展示编写更有针对性的单元测试是如何有益的。他已经知道,当有3页时,它返回2页。你的测试没有显示任何内容。@David B:不,他不知道-他认为这是一个好机会,这是一个incorrect假设。该测试(以及针对各种角落情况的更多测试)将揭示PaginInfo.TotalPages
工作正常,因此问题一定在别处(即在循环中)大卫B:他知道他得到了一个包含2的字符串,其中应该包含3,但他问的是他的计算是否应该受到责备。这样的测试要么表明他的计算不应该受到责备,要么他应该关注PageLinks方法本身(这里就是这种情况)因为他说他正在努力学习TDD,我认为这是一个很好的机会来展示编写更有针对性的单元测试是如何有益的
public int TotalPages
{
get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); }
}
public int GetTotalPages()
{
int fullPages = TotalItems / ItemsPerPage;
bool partialPage = TotalItems % ItemsPerPage != 0;
int result = fullPages + (partialPage ? 1 : 0);
return result;
}
Assert.AreEqual(3, new PagingInfo {TotalItems = 4, ItemsPerPage = 9}.TotalPages);