ডেটটাইম.ডেট.টোডে () উপহাস করার চেষ্টা করা হচ্ছে, কিন্তু কাজ করছে না


158

কেউ আমাকে বলতে পারেন কেন এটি কাজ করছে না?

>>> import mock
>>> @mock.patch('datetime.date.today')
... def today(cls):
...  return date(2010, 1, 1)
...
>>> from datetime import date
>>> date.today()
datetime.date(2010, 12, 19)

সম্ভবত কেউ আরও ভাল উপায় প্রস্তাব করতে পারেন?


1
mockগ্রন্থাগারের ডক্স : voidspace.org.uk/python/mock/exferences.html#
পার্টিশিয়াল

উত্তর:


124

কয়েকটি সমস্যা আছে।

প্রথমত, আপনি যেভাবে ব্যবহার mock.patchকরছেন তা একেবারেই সঠিক নয়। যখন একটি প্রসাধক হিসাবে ব্যবহার, এটি দেওয়া তৈরি function / class (এই ক্ষেত্রে, প্রতিস্থাপন datetime.date.today) একটি সঙ্গে Mockবস্তুর শুধুমাত্র সজ্জিত ফাংশন মধ্যে । সুতরাং, কেবল আপনার today()ইচ্ছার datetime.date.todayমধ্যেই একটি আলাদা ফাংশন হবে যা আপনি যা চান তা প্রদর্শিত হয় না।

আপনি যা দেখতে চান তা আরও এইরকম বলে মনে হচ্ছে:

@mock.patch('datetime.date.today')
def test():
    datetime.date.today.return_value = date(2010, 1, 1)
    print datetime.date.today()

দুর্ভাগ্যক্রমে, এটি কাজ করবে না:

>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "build/bdist.macosx-10.6-universal/egg/mock.py", line 557, in patched
  File "build/bdist.macosx-10.6-universal/egg/mock.py", line 620, in __enter__
TypeError: can't set attributes of built-in/extension type 'datetime.date'

এটি ব্যর্থ হয়েছে কারণ পাইথন অন্তর্নির্মিত প্রকারগুলি অপরিবর্তনীয় - আরও তথ্যের জন্য এই উত্তরটি দেখুন।

এই ক্ষেত্রে, আমি ডেটটাইম সাব-ক্লাস করব myself

import datetime
class NewDate(datetime.date):
    @classmethod
    def today(cls):
        return cls(2010, 1, 1)
datetime.date = NewDate

এবং এখন আপনি করতে পারেন:

>>> datetime.date.today()
NewDate(2010, 1, 1)

13
একটি দুর্দান্ত সমাধান, তবে দুর্ভাগ্যক্রমে পিকিংয়ে সমস্যা তৈরি করে।
ব্যাজেক

14
: যদিও এই উত্তরটি ভাল, এটা একটি বর্গ তৈরি ছাড়া DATETIME উপহাস সম্ভব stackoverflow.com/a/25652721/117268
এমিল Stenström

আপনি কীভাবে datetimeউদাহরণটির মূল মানটিকে পুনরুদ্ধার করবেন ? সাথে deepcoppy?
ওলেগ বেলোসভ

5
করা খুব সহজ:patch('mymodule.datetime', Mock(today=lambda: date(2017, 11, 29)))
ভিক্টর গাভ্রো

1
আরও অনেক সহজ কাজ @patch('module_you_want_to_test.date', Mock( today=Mock(return_value=datetime.date(2017, 11, 29))))
জোনি বিবপ

163

অন্য বিকল্পটি হ'ল https://github.com/spulec/freezegun/ ব্যবহার করা

এটি ইনস্টল করুন:

pip install freezegun

এবং এটি ব্যবহার করুন:

from freezegun import freeze_time

@freeze_time("2012-01-01")
def test_something():

    from datetime import datetime
    print(datetime.now()) #  2012-01-01 00:00:00

    from datetime import date
    print(date.today()) #  2012-01-01

এটি অন্যান্য মডিউল থেকে পদ্ধতি কলগুলিতে অন্যান্য ডেটটাইম কলগুলিকেও প্রভাবিত করে:

other_module.py:

from datetime import datetime

def other_method():
    print(datetime.now())    

main.py:

from freezegun import freeze_time

@freeze_time("2012-01-01")
def test_something():

    import other_module
    other_module.other_method()

এবং পরিশেষে:

$ python main.py
# 2012-01-01

13
একটি খুব দরকারী লাইব্রেরি
শান

3
আপনার ফ্রিজেগান পরীক্ষা ধীরে ধীরে চলতে দেখলে আপনি পাইথন-লিবাফেকটাইম চেষ্টা করতেও পারেন।
সাইমন ওয়েবার

দুর্দান্ত গ্রন্থাগার, তবে দুর্ভাগ্যক্রমে গুগল অ্যাপ ইঞ্জিন এনডিবি / ডেটাস্টোরের সাথে ভাল খেলছে না।
ব্র্যান্ডোন

আমি ভালবাসি যে "ফ্রিজেগান" একটি লাইব্রেরির নাম। আমি সত্যিই পাইথন ডেভসকে ভালবাসি! :-D
মিকি EE

কাজ করে তবে ফ্রিজেগন ধীর গতির বলে মনে হচ্ছে, বিশেষ করে যদি আপনার বর্তমান সময়ের জন্য একাধিক কল নিয়ে জটিল যুক্তি থাকে।
আন্দ্রে বেলিয়াক

115

এটির জন্য মূল্যবান, মক ডকগুলি নির্দিষ্টভাবে ডেটটাইম.ডেট.টডে সম্পর্কে কথা বলে এবং একটি ডমি ক্লাস তৈরি না করে এটি করা সম্ভব:

https://docs.python.org/3/library/unittest.mock-examples.html#partial-mocking

>>> from datetime import date
>>> with patch('mymodule.date') as mock_date:
...     mock_date.today.return_value = date(2010, 10, 8)
...     mock_date.side_effect = lambda *args, **kw: date(*args, **kw)
...
...     assert mymodule.date.today() == date(2010, 10, 8)
...     assert mymodule.date(2009, 6, 8) == date(2009, 6, 8)
...

2
এটি সত্যই আমার পক্ষে কাজ করে নি। যদিও আমি এন্ট্রি সনাক্ত করার প্রচেষ্টা প্রশংসা করি।
প্রদ্যোট

8
প্যাচ ফাংশনে "মাইমডিউল" অর্থ কী?
seufagner

4
লিঙ্কটি এখানে "আংশিক উপহাস" এর অধীনে খুঁজে
লিও সি হ্যান

3
@seufagner mymodule এ বরং বিভ্রান্তিকর ফ্যাশন ব্যাখ্যা করা হয় voidspace.org.uk/python/mock/patch.html#where-to-patch । মনে হচ্ছে আপনার মডিউলটি যদি ব্যবহার করে from datetime import dateতবে এটি মডিউলটির নাম যেখানে from datetime import dateএবং কলটি date.today()প্রদর্শিত হবে
ড্যানিও

1
ধন্যবাদ। কাজ করছে! উদাহরণ: মক.প্যাচ সহ ('টেস্ট.ভিউস.ডেটটাইম') মক_ডেট হিসাবে: mock_date.today.return_value = ডেটটাইম.ডেটটাইম (2016, 9, 18) মক_ডেট.সাইড_এফেক্ট = ল্যাম্বডা * আরগস, ** কেডব্লিউ: তারিখ (* আরগস) , **
কেডব্লু

36

আমি অনুমান করি আমি এর জন্য কিছুটা দেরি করে এসেছি তবে আমার মনে হয় এখানে মূল সমস্যাটি হ'ল আপনি ডেটটাইম.ডেট.টোডে সরাসরি প্যাচ করছেন এবং ডকুমেন্টেশন অনুসারে এটি ভুল।

উদাহরণস্বরূপ, পরীক্ষিত ফাংশনটি যেখানে ফাইলটিতে আমদানি করা রেফারেন্সটি আপনাকে প্যাচ করা উচিত।

ধরা যাক আপনার একটি ফাংশন.পি ফাইল রয়েছে যেখানে আপনার নিম্নলিখিতগুলি রয়েছে:

import datetime

def get_today():
    return datetime.date.today()

তারপরে, আপনার পরীক্ষায় আপনার কিছু হওয়া উচিত

import datetime
import unittest

from functions import get_today
from mock import patch, Mock

class GetTodayTest(unittest.TestCase):

    @patch('functions.datetime')
    def test_get_today(self, datetime_mock):
        datetime_mock.date.today = Mock(return_value=datetime.strptime('Jun 1 2005', '%b %d %Y'))
        value = get_today()
        # then assert your thing...

এই একটি সামান্য বিট করতে সাহায্য করে আশা করি।


এটি দেখতে খুব বাধ্য করার মতো, তবে আমি এটি চালাতে পারি না (একটি ছুড়ে ফেলে NameError: name 'datetime' is not defined)। আপনি যদি নিজের পরীক্ষার ফাইলটিতে আমদানি না করে থাকেন তবে datetime.strptimeরেফারেন্সটি Mock(return_value=...)কোথা থেকে আসবে datetime? আপডেট: এটি ঠিক আছে, আমি কেবল এগিয়ে গিয়ে datetimeপরীক্ষার ফাইলে মডিউলটি আমদানি করেছি । আমি ভেবেছিলাম কৌশলটি কিছুটা কীভাবে আপনি datetimeপরীক্ষার ফাইল থেকে রেফারেন্সটি গোপন করছেন ।
imrek

@ ড্রঙ্কনমাস্টার আপনি কী করছেন এবং কোন রেফারেন্সটিকে আপনি উপহাস করছেন তার একটি উদাহরণ আমাকে দেখতে হবে। তুমি করছ import datetimeনাকি from datetime import strptime? যদি আপনি প্রথম এক করছিলে, আপনি উপহাস আছে চাই datetimeকি mocked_datetime.strptime.return_value = whatever, পরে এক, আপনি সরাসরি ফাইল যেখানে পদ্ধতি জীবন পরীক্ষিত মধ্যে strptime রেফারেন্স উপহাস আছে চাই হয়।
iferminm

@ ইস্রায়েলর্ড আমি যা বলতে চাইছিলাম তা হল আপনার শেষ কোড স্নিপেট (পরীক্ষার ফাইল) Mock(return_value=datetime...)কাজ করার জন্য ডেটটাইম রেফারেন্সের জন্য একটি আমদানি অনুপস্থিত ।
ইমরেক

32

ড্যানিয়েল জি এর সমাধান যোগ করতে :

from datetime import date

class FakeDate(date):
    "A manipulable date replacement"
    def __new__(cls, *args, **kwargs):
        return date.__new__(date, *args, **kwargs)

এটি এমন একটি শ্রেণি তৈরি করে যা তাত্ক্ষণিকভাবে ব্যবহার করার পরে, একটি সাধারণ ডেটটাইম.ডেট অবজেক্ট ফিরে আসবে, তবে যা পরিবর্তন করাও সক্ষম।

@mock.patch('datetime.date', FakeDate)
def test():
    from datetime import date
    FakeDate.today = classmethod(lambda cls: date(2010, 1, 1))
    return date.today()

test() # datetime.date(2010, 1, 1)

2
এখানে খুব সাবধানতা অবলম্বন করুন - আপনার অবশ্যই সংস্করণটি ব্যবহার করা উচিত, অন্যথায় আপনি ডেটটাইম.ডেট (বা ডেটটাইম বা অন্য) ব্যবহার করলে আপনি অদ্ভুততা পেতে পারেন। IE - আপনার জাল নতুন কল হয়ে গেলে স্ট্যাকের গভীরতা পৌঁছে।
ড্যানি স্ট্যাপল

ভুয়া বস্তুটি তার নিজস্ব মডিউলে থাকলে আপনার এই সমস্যা হবে না: dpaste.com/790309 । যদিও এটি বিদ্রূপিত ফাংশনটির মতো একই মডিউলে থাকলেও, এটি আমদানি date/ datetimeনিজেই করে না , এটি বিশ্বব্যাপী উপলভ্য চলকটি ব্যবহার করে, তাই কোনও সমস্যা হওয়া উচিত নয়: dpaste.com/790310
eternicode

একটি কম সংক্ষিপ্ত ব্যাখ্যা এখানে পাওয়া যেতে পারে: williamjohnbert.com/2011/07/...
ezdazuzena

9

কয়েক দিন আগেও আমি একই পরিস্থিতির মুখোমুখি হয়েছিলাম, এবং আমার সমাধানটি ছিল মডিউলের কোনও ফাংশনটি পরীক্ষা করার জন্য এবং এটি উপহাস করার জন্য সংজ্ঞা দেওয়া:

def get_date_now():
    return datetime.datetime.now()

আজ আমি ফ্রিজগান সম্পর্কে জানতে পেরেছি , এবং মনে হচ্ছে এটি সুন্দরভাবে কেস করেছে

from freezegun import freeze_time
import datetime
import unittest


@freeze_time("2012-01-14")
def test():
    assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)

9

আমার পক্ষে সবচেয়ে সহজ উপায় এটি করা:

import datetime
from unittest.mock import Mock, patch

def test():
    datetime_mock = Mock(wraps=datetime.datetime)
    datetime_mock.now.return_value = datetime.datetime(1999, 1, 1)
    with patch('datetime.datetime', new=datetime_mock):
        assert datetime.datetime.now() == datetime.datetime(1999, 1, 1)

এই সমাধান জন্য সতর্কতা: থেকে সমস্ত কার্যকারিতা datetime moduleথেকে target_moduleকাজ করা থামাবে।


1
এটি সত্যিই সুন্দর এবং সংক্ষিপ্ত। লাইনটি datetime_mock.now = Mock(return_value=datetime(1999, 1, 1)আরও ছোট করা যেতে পারে datetime_mock.now.return_value = datetime(1999, 1, 1)। প্যাচটি শুরু করার পরিবর্তে, আপনার পরীক্ষা শেষ হলে আবার নিয়মিত (আনমকড) আচরণ করে তা নিশ্চিত করার জন্য প্রসঙ্গ পরিচালককে start()বিবেচনা করুন । with patch(...):datetime
শির্ক

সর্বদা অন্তর্নির্মিত গ্রন্থাগারটি ব্যবহার করার সমাধানটির পক্ষে
নাম জি ভি ইউ

@ frx08 আমি কীভাবে এই উপহাসকে পুনরায় সেট করতে জানি? মানে কীভাবে datetime.datetime.now()আনমক করা যায়?
নাম জি ভিইউ

আচ্ছা এই উপহাস ব্যবহার করার চেষ্টা পর - এই সমাধান জন্য এক সতর্কতা বিশেষ থেকে সমস্ত কার্যকারিতা হয় datetime moduleথেকে target_moduleকাজ করা থামাবে।
নাম জি ভিউ

1
@ Frx08 এর সাথে সম্মত হন () এর সাথে ব্যথাটি সূক্ষ্ম হবে। যদিও এই ব্লকের ভিতরে সমস্ত যেমন তারিখ, টাইমডেল্টা কাজ করা বন্ধ করবে। আমাদের এখন যদি বিদ্রূপ করা প্রয়োজন তবে তারিখ গণিতটি এখনও চলছে? দুঃখিত, আমাদের অবশ্যই .NO () কে পুরো ডেটটাইম মডিউলটিই নয়, উপহাস করতে হবে।
নাম জি ভিইউ

7

আপনি ড্যানিয়েল জি সমাধানের উপর ভিত্তি করে নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন। এই এক সঙ্গে টাইপ চেক না ভঙ্গ সুবিধা আছে isinstance(d, datetime.date)

import mock

def fixed_today(today):
    from datetime import date

    class FakeDateType(type):
        def __instancecheck__(self, instance):
            return isinstance(instance, date)

    class FakeDate(date):
        __metaclass__ = FakeDateType

        def __new__(cls, *args, **kwargs):
            return date.__new__(date, *args, **kwargs)

        @staticmethod
        def today():
            return today

    return mock.patch("datetime.date", FakeDate)

মূলত, আমরা সি-ভিত্তিক datetime.dateশ্রেণিটি আমাদের নিজস্ব পাইথন সাবক্লাসের সাথে প্রতিস্থাপন করি যা মূল datetime.dateউদাহরণ তৈরি করে এবং কোয়েরিকে isinstance()ঠিক দেশীয় হিসাবে প্রতিক্রিয়া জানায় datetime.date

এটি আপনার পরীক্ষাগুলিতে কনটেক্সট ম্যানেজার হিসাবে ব্যবহার করুন:

with fixed_today(datetime.date(2013, 11, 22)):
    # run the code under test
    # note, that these type checks will not break when patch is active:
    assert isinstance(datetime.date.today(), datetime.date)

অনুরূপ পন্থা datetime.datetime.now()ফাংশন মক করতে ব্যবহার করা যেতে পারে ।


আমি নিশ্চিত না যে এটি পাইথন ২. 2. এ কাজ করে। আমি পদ্ধতিটি সহ সর্বাধিক পুনরাবৃত্তির গভীরতা রানটাইমআরর পাচ্ছি __instancecheck__
ড্যান লোয়েহের্জে

এটি সত্যই পাইথন ২. 2. এ কাজ করে, এবং এটি উদাহরণস্বরূপ চেক দিয়ে আমার সমস্যাটি সমাধান করেছে, ধন্যবাদ!
করাথিউডারী

4

সাধারণভাবে বলতে গেলে, আপনি হয়ত datetimeবা datetime.dateঅন্য কোথাও কোনও মডিউলটিতে আমদানি করেছেন। পদ্ধতিটিকে ঠাট্টা করার আরও কার্যকর উপায় হ'ল এটি আমদানি করা মডিউলে এটি প্যাচ করা। উদাহরণ:

a.py

from datetime import date

def my_method():
    return date.today()

তারপরে আপনার পরীক্ষার জন্য, মক অবজেক্টটি নিজেই পরীক্ষার পদ্ধতির আর্গুমেন্ট হিসাবে পাস হবে। আপনি চান ফলাফলের মানটি দিয়ে আপনি মোককে সেট আপ করবেন এবং তারপরে পরীক্ষার অধীনে আপনার পদ্ধতিটি কল করবেন। তারপরে আপনি জোর দিয়ে বলবেন যে আপনার পদ্ধতিটি আপনি যা চান তা করেছে।

>>> import mock
>>> import a
>>> @mock.patch('a.date')
... def test_my_method(date_mock):
...     date_mock.today.return_value = mock.sentinel.today
...     result = a.my_method()
...     print result
...     date_mock.today.assert_called_once_with()
...     assert mock.sentinel.today == result
...
>>> test_my_method()
sentinel.today

সতর্কতার শব্দ। ঠাট্টা-বিদ্রূপ করে ওভারবোর্ডে যাওয়া সম্ভবত সবচেয়ে সম্ভব। আপনি যখন করেন, এটি আপনার পরীক্ষাগুলি দীর্ঘতর করে তোলে, বোঝা শক্ত হয় এবং বজায় রাখা অসম্ভব। আপনি কোনও পদ্ধতির মতো সহজ বিদ্রূপ করার আগে datetime.date.todayনিজেকে জিজ্ঞাসা করুন আপনার এটির সত্যিকারের উপহাস করার দরকার আছে কিনা। যদি আপনার পরীক্ষাটি সংক্ষিপ্ত এবং বিন্দুতে থাকে এবং ফাংশনটিকে উপহাস না করে সূক্ষ্মভাবে কাজ করে তবে আপনি যে বিষয়টিকে উপহাস করতে হবে তার চেয়ে আপনি কোডটি যা পরীক্ষা করছেন তার অভ্যন্তরীণ বিশদটি সন্ধান করছেন।


2

ম্যাক অবজেক্টটি মূল মডিউলটি মোড়ানোর জন্য কনফিগার করা datetime.date.today()থাকায় যুক্ত হওয়া বোনাসের সাথে বিদ্রূপ করার আরও একটি উপায় এখানে রয়েছে :datetimedatetime

from unittest import mock, TestCase

import foo_module

class FooTest(TestCase):

    @mock.patch(f'{foo_module.__name__}.datetime', wraps=datetime)
    def test_something(self, mock_datetime):
        # mock only datetime.date.today()
        mock_datetime.date.today.return_value = datetime.date(2019, 3, 15)
        # other calls to datetime functions will be forwarded to original datetime

wraps=datetimeযুক্তিটি নোট করুন mock.patch()- যখন foo_moduleঅন্যান্য datetimeফাংশনগুলি ব্যবহার date.today()করে সেগুলি আসল মোড়ানো datetimeমডিউলটিতে ফরোয়ার্ড করা হবে ।


1
দুর্দান্ত উত্তর, বেশিরভাগ পরীক্ষাগুলি যেখানে আপনাকে তারিখের উপহাস করতে হবে সেখানে আপনাকে ডেটটাইম মডিউলটি ব্যবহার করতে হবে
এন্টোইন ভো

1

Http://blog.xelnor.net/python-mocking-datetime/ এ বেশ কয়েকটি সমাধান আলোচনা করা হয়েছে । সংক্ষেপে:

মোক অবজেক্ট - সহজ এবং দক্ষ তবে বিচ্ছিন্নতা () পরীক্ষাগুলি:

target = datetime.datetime(2009, 1, 1)
with mock.patch.object(datetime, 'datetime', mock.Mock(wraps=datetime.datetime)) as patched:
    patched.now.return_value = target
    print(datetime.datetime.now())

মক ক্লাস

import datetime
import mock

real_datetime_class = datetime.datetime

def mock_datetime_now(target, dt):
    class DatetimeSubclassMeta(type):
        @classmethod
        def __instancecheck__(mcs, obj):
            return isinstance(obj, real_datetime_class)

    class BaseMockedDatetime(real_datetime_class):
        @classmethod
        def now(cls, tz=None):
            return target.replace(tzinfo=tz)

        @classmethod
        def utcnow(cls):
            return target

    # Python2 & Python3 compatible metaclass
    MockedDatetime = DatetimeSubclassMeta('datetime', (BaseMockedDatetime,), {})

    return mock.patch.object(dt, 'datetime', MockedDatetime)

হিসাবে ব্যবহত:

with mock_datetime_now(target, datetime):
   ....

0

হতে পারে আপনি নিজের "আজ ()" পদ্ধতিটি ব্যবহার করতে পারেন যা আপনার প্রয়োজন অনুসারে প্যাচ করবে। উপহাসের সাথে () উপহাস করার উদাহরণ এখানে পাওয়া যাবে: https://bitbucket.org/k_bx/blog/src/tip/source/en_posts/2012-07-13-double-call-hack.rst?at=default


@JensTimmerman দয়া করে দেখুন bitbucket.org/k_bx/blog/src/tip/source/en_posts/...
Konstantine Rybnikov

0

আমি কাস্টম ডেকরেটর ব্যবহার করে @ ব্যবহারকারীর 3016183 পদ্ধতিটি প্রয়োগ করেছি:

def changeNow(func, newNow = datetime(2015, 11, 23, 12, 00, 00)):
    """decorator used to change datetime.datetime.now() in the tested function."""
    def retfunc(self):                             
        with mock.patch('mymodule.datetime') as mock_date:                         
            mock_date.now.return_value = newNow
            mock_date.side_effect = lambda *args, **kw: datetime(*args, **kw)
            func(self)
    return retfunc

আমি ভেবেছিলাম যে একদিন কারও সাহায্য করতে পারে ...


0

datetimeযোগ না করে মডিউল থেকে ফাংশনগুলি উপহাস করা সম্ভবside_effects

import mock
from datetime import datetime
from where_datetime_used import do

initial_date = datetime.strptime('2018-09-27', "%Y-%m-%d")
with mock.patch('where_datetime_used.datetime') as mocked_dt:
    mocked_dt.now.return_value = initial_date
    do()

0

আপনারা যারা উপহাসের সাথে পাইস্ট ব্যবহার করছেন তাদের জন্য আমি এখানে কীভাবে উপহাস করেছি datetime.datetime.now()যা মূল প্রশ্নের সাথে খুব মিল similar

test_get_now(mocker):
    datetime_mock = mocker.patch("blackline_accounts_import.datetime",)
    datetime_mock.datetime.now.return_value=datetime.datetime(2019,3,11,6,2,0,0)

    now == function_being_tested()  # run function

    assert now == datetime.datetime(2019,3,11,6,2,0,0)

মূলত মোককে নির্দিষ্ট তারিখটি ফিরিয়ে দিতে হবে। আপনি ডেটটাইম অবজেক্টের উপর সরাসরি প্যাচ করতে সক্ষম নন।


0

আমি মোক datetimeহিসাবে realdatetimeপ্রয়োজনীয় পদ্ধতিগুলি বাস্তব পদ্ধতিগুলির সাথে আমদানি করে এবং প্রতিস্থাপন করে এই কাজটি করেছি:

import datetime as realdatetime

@mock.patch('datetime')
def test_method(self, mock_datetime):
    mock_datetime.today = realdatetime.today
    mock_datetime.now.return_value = realdatetime.datetime(2019, 8, 23, 14, 34, 8, 0)

0

আপনি এটি datetimeব্যবহার করে বিদ্রূপ করতে পারেন :

মডিউলটিতে sources.py:

import datetime


class ShowTime:
    def current_date():
        return datetime.date.today().strftime('%Y-%m-%d')

আপনার tests.py:

from unittest import TestCase, mock
import datetime


class TestShowTime(TestCase):
    def setUp(self) -> None:
        self.st = sources.ShowTime()
        super().setUp()

    @mock.patch('sources.datetime.date')
    def test_current_date(self, date_mock):
        date_mock.today.return_value = datetime.datetime(year=2019, month=10, day=1)
        current_date = self.st.current_date()
        self.assertEqual(current_date, '2019-10-01')

sourcesআপনার প্যাচ শোভাকর মধ্যে কি ?
এ্যালেনা

প্রিয় @ এলেনা, আমি প্রায় এক বছর আগে আমি কী ভাবছিলাম তা মনে রাখা বরং কঠিন))। আমি অনুমান করি যে আমি আমাদের অ্যাপ্লিকেশন উত্সগুলির কেবলমাত্র কোনও মডিউল বলতে চাইছি - কেবলমাত্র আপনার আবেদনের কোড।
এমটিমোবাইল

0

সিপিথন প্রকৃত-পাইথন লিব / ডেটটাইম.পি এবং সি-অপ্টিমাইজড মডিউল / _ডেটটাইমডিউল.সি উভয় ব্যবহার করে ডেটটাইম মডিউলটি বাস্তবায়ন করে । সি-অপ্টিমাইজড সংস্করণটি প্যাচ করা যায় না তবে খাঁটি-পাইথন সংস্করণটি পারে।

লিবি / ডেটটাইম.পি -তে খাঁটি-পাইথন প্রয়োগের নীচে এই কোডটি রয়েছে:

try:
    from _datetime import *  # <-- Import from C-optimized module.
except ImportError:
    pass

এই কোডটি সমস্ত সি-অনুকূলিত সংজ্ঞা আমদানি করে এবং কার্যকরভাবে সমস্ত খাঁটি-পাইথন সংজ্ঞা প্রতিস্থাপন করে। আমরা সিপিথনকে ডেটটাইম মডিউলটির খাঁটি-পাইথন প্রয়োগ করতে বাধ্য করতে পারি:

import datetime
import importlib
import sys

sys.modules["_datetime"] = None
importlib.reload(datetime)

সেট করে sys.modules["_datetime"] = None, আমরা পাইথনকে সি-অনুকূলিত মডিউলটিকে উপেক্ষা করতে বলি। তারপরে আমরা মডিউলটি পুনরায় লোড করি যা থেকে আমদানির কারণ হয়_datetime ব্যর্থ হতে দেয়। এখন খাঁটি-পাইথন সংজ্ঞাগুলি রয়ে গেছে এবং সাধারণত প্যাচ করা যায়।

আপনি ব্যবহার করেন, তাহলে Pytest তারপর উপরে স্নিপেট অন্তর্ভুক্ত conftest.py এবং আপনার প্যাচ করতে datetimeবস্তু স্বাভাবিকভাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.