【问题标题】:Function doesn't match test results功能与测试结果不符
【发布时间】:2014-11-05 07:54:39
【问题描述】:

我应该运行文件assign2_partI_test_file 并得到下面的结果。我就是无法得到正确的结果。

我的代码:

def to_string(my_list, sep=', '):

  result = ' '
  msg = 'List is: '
  for char in my_list:

      str_list1 = ['r', 'i', 'n', 'g', 'i', 'n', 'g']

      if my_list == str_list1:

          result = msg + sep.join(my_list)

      return result

我的输出:

Start testing!

length Test

Start Testing!

length Test
List length: 7
List length: 0

to_string Test
List is: r, i, n, g, i, n, g
List is: r-i-n-g-i-n-g
None # (THIS IS SUPPOSED TO DISPLAY: List is: )

测试代码:

import list_function

print("\nStart Testing!")

str_list1 = ['r', 'i', 'n', 'g', 'i', 'n', 'g']
str_list2 = ['r', 'e', 'd']
empty = []

print("\nlength Test")
print("List length:", list_function.length(str_list1))
print("List length:", list_function.length(empty))

print("\nto_string Test")
string = list_function.to_string(str_list1)
print(string)
string = list_function.to_string(str_list1, sep='-')
print(string)
print(list_function.to_string(empty))

print("\nEnd Testing!\n")

【问题讨论】:

  • 你已经得到了有用的测试代码,它清楚地显示了你的问题;如果输入是一个空列表,您的代码不会做正确的事情。那么你有什么办法来解决它?请注意,您当前的代码仅在 returns 内 for 循环内;也许你应该更仔细地考虑一下。
  • 好的,我尝试了一天超过 1/2 的时间。这是最接近的,我可以得到预期的输出。
  • @Macrick 查看我的回答

标签: python unit-testing


【解决方案1】:

我将更多地作为评论来回答这个问题:

def to_string(my_list, sep=', '):

  result = ' ' 
  # only needed because of the odd return
  msg = 'List is: ' 
  # fine, but you only use it once, so why not put the literal there?
  for char in my_list: 
  # why loop?

      str_list1 = ['r', 'i', 'n', 'g', 'i', 'n', 'g'] 
      # hard-coded the test...

      if my_list == str_list1: 
      # ...so you guarantee it only works for one input - why?!

          result = msg + sep.join(my_list) 
          # this line is useful

      return result 
      # but only inside the for loop?!

您可以将函数缩短为一行(您已经编写了很多!),这样做的好处是它会变得有意义并且可以工作。


这是一个与您的函数输出相匹配的简化函数:

def to_string(my_list, sep=', '):
    if my_list == ['r', 'i', 'n', 'g', 'i', 'n', 'g']: # test case
        return 'List is: ' + sep.join(my_list)
    elif len(my_list) > 0: # any other non-empty list
        return ' '
    else: # empty list
        return None

这会让事情更清楚吗?这三个案例之间真的应该有这么大(或任何)差异吗?

【讨论】:

  • 说真的,如果您没有意图,请不要回答。真的不,谢谢。
  • @Macrick 你期待什么?这不是一个代码编写服务,我试图强调你的错误。你实际上编写了正确的代码,然后莫名其妙地用一堆没有逻辑意义的东西包围它。
【解决方案2】:

为什么不在elifelse 部分写下其他条件?你写了一个条件,即仅当my_list == str_list1。但是其他情况会发生什么?例如empty 列表?你可能也想检查一下。

def to_string(my_list, sep=', '):
    result = ' '
    msg = 'List is: '
    str_list1 = ['r', 'i', 'n', 'g', 'i', 'n', 'g']
    if my_list == str_list1:
        result = msg + sep.join(my_list)
    elif my_list == []:            ## you can also use "len(my_list) == 0:"
        result = msg
    return result

现在您遇到问题None # (THIS IS SUPPOSED TO DISPLAY: List is: ) 的原因是for 循环。for char in my_list: 仅在my_list 非空时运行。但是,当您传递空列表时,for 循环将不会执行,因为它没有可迭代的内容。

【讨论】:

  • 谢谢,我进一步探索。干杯
  • @Macrick 欢迎。如果您认为我的回答对您有所帮助,请不要忘记在离开时投票并接受它! :)
猜你喜欢
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
相关资源
最近更新 更多