简体   繁体   中英

side_effect for "sys.argv" returns a tuple of 1,1 regardless of what I set it to when doing mock.patch

For some reason side_effect isn't having an effect when I try to change the first two instances of sys.argv to be anything they just default to 1,1.

"""testing"""
def check_arg():
try:
    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])
except IndexError:
    return False, False
except ValueError:
    return False, False
else:
    if num1 < num2:
        return num1, num2
  #  elif num1 == num2:
  #     return False, False
    else:
        return num2, num1       


  """test"""
  @mock.patch("sys.argv", side_effect=["9", "2"])
  def test_check_arg(self, mocktest):
    checkarg = check_arg()
    self.assertEqual(checkarg, (2, 2))

"""

Problem: ... , line 23, in test_check_arg self.assertEqual(checkarg, (2, 2)) AssertionError: Tuples differ: (1, 1),= (2, 2)

First differing element 0: False 2

  • (1,1)
  • (2, 2)

It seems that side_effect is not what you need in this case. It's enough if you use:

"""testing"""
def check_arg():
try:
    num1 = int(sys.argv[0])
    num2 = int(sys.argv[1])
except IndexError:
    return False, False
except ValueError:
    return False, False
else:
    if num1 < num2:
        return num1, num2
  #  elif num1 == num2:
  #     return False, False
    else:
        return num2, num1       


  """test"""
  @mock.patch("sys.argv", ["9", "2"])
  def test_check_arg(self):
    checkarg = check_arg()
    self.assertEqual(checkarg, (2, 9))

This should work fine. But reading the docs about sys.argv ( https://docs.python.org/3/library/sys.html#sys.argv ) sys.argv[0] always contains the name of the script so it will probably be better like:

It seems that side_effect is not what you need in this case. It's enough if you use:

"""testing"""
def check_arg():
try:
    num1 = int(sys.argv[1])
    num2 = int(sys.argv[2])
except IndexError:
    return False, False
except ValueError:
    return False, False
else:
    if num1 < num2:
        return num1, num2
  #  elif num1 == num2:
  #     return False, False
    else:
        return num2, num1       


  """test"""
  @mock.patch("sys.argv", ["test_argv.py", "9", "2"])
  def test_check_arg(self):
    checkarg = check_arg()
    self.assertEqual(checkarg, (2, 9))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM