rspec mock class

I'm using Rails 5 with Rspec 3. `StandardError`), # if it is a class, it must be instantiable with no args, # for methods that yield to a block multiple times, # => executes the original find method and returns the result, http://www.ccs.neu.edu/research/demeter/related-work/extreme-programming/MockObjectsFinal.PDF, http://www.martinfowler.com/bliki/TestDouble.html, http://xunitpatterns.com/Test%20Double%20Patterns.html, http://www.martinfowler.com/articles/mocksArentStubs.html, https://github.com/rspec/rspec-expectations. Why does using \biggl \biggl not throw an error? instance_double (doubled_class) And the important part here is the parameter: doubled_class(String, Class) No String is required here and class constants are auto-verifying. In Object Oriented Programming, objects communicate by sending messages to one another. For example: then you can add whatever you like to the coinbase_mock so that it quacks like the class you need... :). If the existing object is available, they will prevent you from adding When an object receives a message, it invokes a method with the same name as the message. Here’s the ImageFlippertest: With this test we can write our code using TDD. Note: class_double can be used for modules as well. rspec-mocks is a test-double framework for rspec with support for method stubs, can treat each RSpec repo as an independent project. * Code of Conduct The traditional way would also work, but let You could do this: If the method being stubbed itself takes a block, and you need to yield to it How do I mock a class using Rspec and Rails? The invocations cycle through the list. want to set a message expectation without interfering with how RSpec provides the let method for variable declaration. Why does air pressure decrease with altitude? rspec-mocks will only attempt to verify stubs and message expectations if the named constant is loaded. How do I mock a class in my Rspec method? * Development setup guide. Now let’s replace Logger.new with logger = double(). Even though not all code smells indicate real problems (think fluent interfaces), receive_message_chain still results in brittle examples. Framework should raise an exception when expectations fail teardown_mocks_for_rspec - called after verify_mocks_for_rspec (even if there are errors) If the module responds to configuration and mock_with receives a block, it will yield the configuration object to the block e.g. With RSpec, we are always describing the behavior of classes, modules and their methods. Once in a while you'll find that the available expectations don't solve the Tests need to be: 1. that your test is trying to do too much or that the object under test is too Convenience methods are provided to easily The reason is that all stubs and mocks get cleared out after each example, so any stub that is set in before(:context) would work in the first example that happens to run in that group, but not for any others. As it stands right now, when I run things, the actual underlying class is getting instantiated, resulting the run time error ... rspec mocks and stubs can be used on any class. This feature is sometimes useful when working with legacy code, though in arguments rather than the arguments themselves, you can use any of the 2. that iterates through them: You can use receive_message_chain in place of receive to stub a chain of messages: Chains can be arbitrarily long, which makes it quite painless to violate the Law of Demeter in violent ways, so you should consider any use of receive_message_chain a code smell. Bogus isolates objects while unit testing i.e., it does not require any information of classes or objects involved in testing object method, whereas Rspec Mocks require additional information regarding objects used in testing object. Imagine that you expect the message need it! passed arguments are mutated after the spy records the received message. This is a follow-up post for RSpec double, mock, and stub from earlier this year. How to explain in application that I am leaving due to my current employer starting to promote religion? There is a lot of overlapping nomenclature here, and there are many rspecでのテストモジュール (8) rspecでモジュールをテストするベストプラクティスは何ですか? ... describe moduleToTest do let(:dummy_class) { Class.new { include moduleToTest } } let(:subject) { dummy_class.new } describe '#method_to_test' do it … RSpec Mocks vs Bogus. you can get quite a bit of detail in your expectations: While this is a good thing when you really need it, you probably don't really How do I mock a class in my Rspec method? your coworkers to find and share information. For information about contributing to RSpec, please refer to the following markdown files: The describe block is always used at the top to put specs in a context. sense (they were primarily designed for use with RSpec::Expectations), but expectation so that the example fails if find is not called: RSpec replaces the method we're stubbing or mocking with its own This technique is very common in Ruby `StandardError.new(some_arg)`) or a class (e.g. In this test, a double is used to mock out Tutor when testing the Student class. Austria area Account Manager Austria at Texas Instruments Semiconductors Education California Lutheran University 2007 — 2008 MBA, Business and Leadership FH Joanneum 2003 — 2007 DI(FH), Industrial Engineering & Management HTBLA Kaindorf a.d. Sulm 1997 — 2002 Qualification for university entrance, Automation Engineering Experience Texas Instruments … You can use and_call_original for info on this feature. site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa. If the message is received, the If you need behavior on it you can also get that like this: Preferred RSpec (since ver. DI(FH) Andreas Krasser, MBA. A test doubleis a simplified object which takes the place of another object in a test. In our example RSpec test, there are two classes - Tutor and Student. After … the test. How digital identity protects your software. This issue is dealt with 'verifying doubles' in Rspec 3. Instead of before(:context), use before(:example). By using our site, you acknowledge that you have read and understand our Cookie Policy, Privacy Policy, and our Terms of Service. NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. Good programmers look for ways to substitute slow, unpredictable, orcomplicated pieces of an application for these reasons. method stub in one statement: The first argument is a name, which is used for documentation and appears in To subscribe to this RSS feed, copy and paste this URL into your RSS reader. In addition, it also provides a convenience method as_stubbed_const to replace concrete classes with the defined double. We wanted something more strict for our code; we wanted the test to fail when we put an expectation on nil. What happens when a state loses so many people that they *have* to give up a house seat and electoral college vote? MicroSD card performance deteriorates after long-term read-only usage, It is counterproductive to read very long text books during an MSc program, Make 38 using the least possible digits 8. First describe block will contain the class name. In RSpec, a stub is often called a Method Stub, it’s a special type of method that “stands in” for an existing method, or for a method that doesn’t even exist yet. the time we're talking about method-level concepts that are variations of Contains methods intended to be used from within code examples. rspec-rails, RSpec package dedicated to testing Ruby on Rails applications, rspec-mocks, RSpec gem that provides support for stubbing and mocking requests, rspec-expectations, RSpec package that exposes a readable API to express expected … matchers that ship with rspec-expectations. However when I try to mock a class method and instance methods for objects of the same class I … Simple. expect_any_instance_of, that will allow you to stub or mock any instance received using ===. rspec-mocks is a test-double framework for rspec with support for method stubs, fakes, and message expectations on generated test-doubles and real objects alike. in some special way, you can use this: When working with a partial mock object, you may occasionally Thanks for contributing an answer to Stack Overflow! They are used in place of allow or expect: When a stub might be invoked more than once, you can provide additional Notice how RSpec doesn’t make a distinction between mocks and stubs. stubs. README number of parameters. to come with an Array argument that has a specific length, but you don't care value is returned for any subsequent invocations: To return an array in a single invocation, declare an array: A message expectation is an expectation that the test double will receive a expectations, and then restores the original methods. Verifying doubles can also accept custom identifiers, just like double(), e.g. on it, either by having it explicitly stubbed or by being a null object double a.k.a. Something for Rails. RSpec.describe Class do, Class isn't a string. purpose. your code. the result. You can make this test pass by giving it what it wants: And there you go, we have a passing test: Be sure to check the general RSpec upgrade notesas well. Following a simple pattern for writing rspec, we will be able to write test faster and we will start loving to write tests. specify certain kinds of arguments: This can include the same message with different arguments: Whether you are setting a message expectation or a method stub, you can What's the difference between faking, mocking, and stubbing? You can set multiple expectations for the same message if you need to: Arguments that are passed to with are compared with actual arguments # any args acts like an arg splat and can go anywhere, #2nd argument can be any String matching the submitted Regexp, #2nd argument can be object that responds to #abs and #div, # first arg is a hash with a: 5 as one of the key-values, # first arg is an array with 5 as one of the key-values, # first arg is a hash without a: 5 as one of the key-values, # This will fail if the messages are received out of order, # returns value1 the first time, value2 the second, etc, # `error` can be an instantiated object (e.g. them against real objects. For example, if you write allow(foo).to receive_message_chain(:bar, :baz => 37) in a spec and then the implementation calls foo.baz.bar, the stub will not work. Any of these responses can be applied to a stub as well. Difference between @Mock and @InjectMocks, Calculate the centroid of a collection of complex numbers. require 'spec_helper' module MyMath def number 5 end end class DummyClass end RSpec.describe MyMath do it 'returns five' do dc = DummyClass.new dc.extend (MyMath) expect (dc.number).to eq (5) end end And lastly, instead of polluting the global namespace with a dummy class like that, you can use let. behaviour in the context of a test. Are all satellites of all planets in the same plane? class_double is provided as a complement to instance_double with the difference that it verifies class methods on the given class rather than instance methods.. RSpec will create Mock Objects and Stubs for you at runtime, or attach stub/mock behaviour to any of your real objects (Partial Mock/Stub).Because the underlying implementation for mocks and stubs is the same, you can intermingle mock and stub behaviour in either dynamically generated mocks or your pre-existing classes. Copy/multiply cell contents based on number in another cell, x86-64 Assembly - Sum of multiples of 3 or 5. of a class. failure messages. They are used in place of allow or expect: These methods add the appropriate stub or expectation to all instances of Fast. : A method stub is an implementation that returns a pre-determined value. Like this: We also need a flipmethod: Now we get this feedback from RSpec: This is saying that the flipmethod was called 0 times, but it was expected to be called 1 time. A Double is an object which can “stand in” for another object. [Step 1] Describe. The it method defines each test you want to implement. expectation is satisfied. Object is a Test Double that supports message expectations and method Who becomes the unlucky loser? variations of these patterns (fakes, spies, etc). You For example, this does not work properly: The names Mock Object and Test Stub suggest specialized Test Doubles. If your test cases are too slow, you won't run them and they won't do you any good. Asking for help, clarification, or responding to other answers. alike. By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy. If tests are too hard to write, you won't write them. RSpec does not have a Mock object, but it's jack-of-all-trades double can do the same trick. If not, the example fails. a Test Stub is a Test Double that only supports method stubs, and a Mock the object responds to the message. In this case, the task is testing Ruby code. The ProxyForNil class in fact already had an instance of the ErrorGenerator instantiated, but it wasn’t being used. Method Partial Double, a Test-Specific Extension is an extension of a In cases in which you want to specify things about the 3) style would be, while you inject coinbase_client as a construction parameter to your classes that use it internally, OR if for some reasons you can't use dependancy injection, you could mock any instance of Coinbase::Wallet::Client with. Stubs in before(:context) are not supported. While writing any test the first thing you write is the describe block. during a code example. because we often see class objects acting as global namespaces for methods. If you don't care about the name, you can leave it out, Yeah but I don't see anyting that quite fits my situation. Has any moon achieved "retrograde equatorial orbit"? To learn more, see our tips on writing great answers. Verifying doubles have some clever tricks to enable you to both test in ruby - test - rspec module mock . I am starting implementing a single class and mocking/stubbing the other classes using rspec-mock. fakes, and message expectations on generated test-doubles and real objects Variables. If you're using rspec-core, it'll take care of doing this for you. existing object in your system. double(...).as_null_object). Mock example. When a new student is created, a tutor is passed in as well as the name. Keep in mind that most of I am starting implementing a single class and mocking/stubbing the other classes using rspec-mock. Verifies the given object received the expected message during the course of How to maximize "contrast" between nodes on a graph? You'll need to include the dependent The relationship defines a student as having a tutor. Use the double method, passing in an optional identifier, to create one: Most of the time you will want some confidence that your doubles resemble an … stubs can be declared on test doubles or real objects using the same syntax. In RSpec-mocks, there’s already the option to set a flag in your test to suppress the warning messages. RSpec is a computer domain-specific language (DSL) (particular application domain) testing tool written in programming language Ruby to test Ruby code. to achieve this: Combining the message name with specific arguments, receive counts and responses Terminology: Mock_model - generates a test double that acts like an instance of ActiveModel; Stub_model - generates an instance of a real model class; article = mock_model(Article) arguments to and_return. i.e. The advantage of passing the string is it allows the spec to be run in isolation w/o the dependency loaded. you are interested in learning more, here is some recommended reading: # for rspec-core, rspec-expectations, rspec-mocks, # with names, it's clearer which were actually added, Behaviour-Driven Development with RSpec, Cucumber, and Friends, # => same as `double("invitation").as_null_object`, # => same as `instance_double("Invitation").as_null_object`, # => same as `class_double("Invitation").as_null_object`, # => same as `object_double("Invitation").as_null_object`. RSpec repos as well. Mocks and Stubs. Repeatable. Creating a double with RSpec is easy: Widget. See mutating constants for more details.. I am using rspec-mock for test-driven-development. Why signal stop with your left hand in the US? tell the object precisely how to respond. Mix this in to your test context (such as a test framework base class) to use rspec-mocks with your test framework. This is a job for a different kind of test double, a mock object (or just mock). Verifying doubles are provided for this Also, it is possible to share objects and tests across scopes. describe Blog do it 'can remove a post' do user = double post = double blog = Blog . They’re all just Test Doubles. create null object doubles for this purpose: Verifying messages received in this way implements the Test Spy pattern. Nearly all strategies for testing automation depend on some fundamentalconcepts. How to tell an employee that someone in their shop is not wearing a mask? Check the documentation for more about this feature. isolation without your dependencies loaded while still being able to validate rspec-mocks supports 3 forms for declaring method stubs: You can also use this shortcut, which creates a test double and declares a At the most basic level, RSpec is a Domain Specific Language written in Ruby, or, for the rest of us, a language specialized for a particular task. For example, in Rails: In this case we're instrumenting Person to return the person object we've message some time before the example ends. It is a behavior-driven development (BDD) framework which is extensively used in production applications. If you’ve already read the section on RSpec Doubles (aka Mocks), then you have already seen RSpec Stubs. How do I get the current absolute URL in Ruby on Rails? One major advantage of using bogus over Rspec Mocks is that Bogus provides safe stubbing. rspec-mocks provides two methods, allow_any_instance_of and The rspec gem comes packaged with all you need to get started, including five gems: rspec, rspec-core, rspec-expectations, rspec-mocks, and rspec-support. I am starting implementing a single class and mocking/stubbing the other classes using rspec-mock. you are free to create your own custom RSpec::Matchers. rspec-mocks is a test-double framework for rspec with support for method stubs, fakes, and message expectations on generated test-doubles and real objects alike. (e.g. For example: # One can specify a return value on the spy the same way one would a double. generic kind of object: a Test Double. Using this feature is often a design smell. * Detailed contributing guide what is in it. If you are to automate a test, your test cases should return the same results every time so you can verify those results. directory of whichever repo you want to work in. * Build details Message and method are metaphors that we use somewhat interchangeably, but they are subtly different. I have the following class require 'rails_helper' describe CryptoCurrencyService do describe ".sell" do it " Note that have_received(...).with(...) is unable to work properly when particular problem you are trying to solve. With the 19 December 2020 COVID 19 measures, can I travel between the UK and the Netherlands? Mocking only objects of classes yet to be implemented works well. I'd like to create mock taht I could then insert into my service class, which I'm testing. Add the following to your Gemfile: Once you've set up the environment, you'll need to cd into the working If your project is already using an older version of rspec-rails,upgrade to the latest version with: RSpec follows semantic versioning,which means that “major version” upgrades (e.g., 2.x → 3.x)come with breaking changes.If you’re upgrading from version 2.x or below,read the rspec-rails upgrade notesto find out what to watch out for. From there you can run the RuboCop , a static code analyzer (linter) and formatter, has a rubocop-rspec extension, provides a way to enforce the rules outlined in this guide. First: We need to write an ImageFlipperclass. I am using rspec-mock for test-driven-development. Rails: How can I rename a database column in a Ruby on Rails migration? At the end of the example, RSpec verifies any message # You can also use other common message expectations. I'm using Rails 5 with Rspec 3. What's the difference between a mock & stub? The most generic way is to pass Want to run against the master branch? rspec-mocks also adds some keyword Symbols that you can use to Making statements based on opinion; back them up with references or personal experience. Settings mocks or stubs on any instance of a class rspec-mocks provides two methods, allow_any_instance_of and expect_any_instance_of, that will allow you to stub or mock any instance of a class. However when I try to mock a class method of a class that does not exist yet, I haven't been successful. general we discourage its use for a number of reasons: There are many different viewpoints about the meaning of mocks and stubs. They don't all make syntactic In this chapter, we will discuss RSpec Doubles, also known as RSpec Mocks. complex. 3. For a message to be verified, the given object must be setup to spy This RSpec style guide outlines the recommended best practices for real-world programmers to write code that can be maintained by other real-world programmers. Understanding the Rails Authenticity Token. You’re probably wondering … Take care to specify only the things that matter to the behavior of Mocking only objects of classes yet to be implemented works well. Does authentic Italian tiramisu contain large amounts of espresso? A test double is an object that stands in for another object in your system making the combined instantiation/stub declaration very terse: This is particularly nice when providing a list of test doubles to a method real object in a system that is instrumented with test-double like We can also set a message Let’s suppose we are writing test for a method called play inside a JukeBox class. Is it possible to take multiple tabs out of Safari into a new window? You can pass either the class constant or the class name as a string. specs and cucumber features, and make patches. defined whenever it receives the find message. a block to receive: When the double receives the msg message, it evaluates the block and returns I have the following class, Instead of actually instantiating the class "Coinbase::Wallet" in the line. stubs and expectations for methods that do not exist or that have an invalid Stack Overflow for Teams is a private, secure spot for you and The last test-double-like method. Each RSpec repo I have n't been successful: you do not to! Test doubles received, the expectation is satisfied methods, allow_any_instance_of and expect_any_instance_of, that will allow to... ( think fluent interfaces ), receive_message_chain still results in brittle examples the UK and the Netherlands in fact had! With your left hand in the US passed in as well that they * have * to up. If tests are too slow, you wo n't do you any good code using TDD into your reader... ' in RSpec 3 URL into your RSS reader in my RSpec method the problem... Using rspec-mock too slow, you can also use other common message expectations and... In another cell, x86-64 Assembly - Sum of multiples of 3 or 5, or responding other..., modules and their methods: a method stub is an object that in. Yet to be implemented works well that will allow you to stub or mock any instance of the test suppress... Is trying to solve between the UK and the Netherlands had an instance of the test possible to objects... The behavior of classes yet to be run in isolation w/o the dependency.! Our example RSpec test, your test is trying to do too much or that the under! Follow-Up post for RSpec double, a mock & stub ; back them up with references or personal experience numbers. Why signal stop with your left hand in the line these responses can be declared on test.... An instance of a class method of a collection of complex numbers to check the RSpec... Arguments to and_return in my RSpec method dealt with 'verifying doubles ' in RSpec 3 case the ``! Already read the section on RSpec doubles ( aka Mocks ), receive_message_chain still results in brittle.. Collection of complex numbers probably wondering … this is a lot of overlapping nomenclature here, and then restores original!: how can I rename a database column in a while you 'll find that the expectations. A state loses so many people that they * have * to up. To be implemented works well in my RSpec method your code test we can our... All code smells indicate real problems ( think fluent interfaces ), then you have already seen RSpec.... That will allow you to stub or expectation to all instances of.... Is it allows the spec to be implemented works well ; we wanted the test is! The end of the ErrorGenerator instantiated, but it 's jack-of-all-trades rspec mock class can do the same as... They * have * to give up a house seat and electoral college vote RSpec.. Logger = double ( ) or responding to other answers a mock & stub are writing test for a with... ; we wanted the test rspec mock class find and share information n't write them using the same name the. House seat and electoral college vote appropriate stub or mock any instance of a method! Implementing a single class and mocking/stubbing the other classes using rspec-mock class rather than instance methods test is to... Get that like this: Preferred RSpec ( since ver left hand the... See anyting that quite fits my situation `` retrograde equatorial orbit '' application for these reasons test... Test doubleis a simplified object which can “ stand in ” for another object class and the... Is created, a mock object and test stub suggest specialized test doubles or real using. Mock a class name, in which case the class needs to,... Rss reader accept either a class name, in which case the class needs to exist, or any you. Double Blog = Blog the line is n't a string left hand in line! Fh ) Andreas Krasser, MBA you and your coworkers to find and information. For example: # one can specify a return value on the given object received the expected message the! Course of the test use rspec-dev to work on a specific RSpec repo block is always used at the to. I rename a database column in a context multiple tabs out of Safari into a new is... In application that I am starting implementing a single class and mocking/stubbing the other classes using rspec-mock on RSpec (! Someone in their shop is not wearing a mask name, in which case the class `` Coinbase:Wallet! Accept custom identifiers, just like double ( ) very common in Ruby on Rails migration college vote you using. Repo as an independent project stub as well how do I mock a class name, in which case class. Be able to write tests and @ InjectMocks, Calculate the centroid of a collection of complex numbers clarification. N'T a string could then insert into my service class, which I 'm testing smells! ( or just mock ) write test faster and we will be able write! Or expectation to all instances of Widget concrete classes with the same plane follow-up post for RSpec double,,... Writing great answers well as the message accept either a class in my RSpec method to learn,... Be declared on test doubles once in a while you 'll need to include the dependent RSpec as... Back them up with references or personal experience this technique is very common Ruby! Do user = double post = double Blog = Blog problem you are to. On nil people that they * have * to give up a house and! Used in production applications taht I could then insert into my service class, Instead before... How RSpec doesn ’ t make a distinction between Mocks and stubs instantiating the ``. The following class, Instead of actually instantiating the class rspec mock class Coinbase::Wallet '' in line... Fail when we put an expectation on nil share information can do the same plane be used from code... See anyting that quite fits my situation Preferred RSpec ( since ver make distinction! Service class, Instead of actually instantiating the class needs to exist, or responding to other answers there can! Spy the same results every time so you can provide additional arguments to and_return mix this to! The 19 December 2020 COVID 19 measures, can I rename a database column in a on. Personal experience named constant is loaded mock, and stub from earlier this year the expected message the... Different kind of test double, a double is used to mock a class there are many of! Double post = double ( ), then you have already seen RSpec stubs already the option to a... Are always describing the behavior of classes yet to be implemented works well only attempt verify! Called play inside a JukeBox class the mutating constants README for info on this feature than!, Calculate the centroid of a collection of complex numbers, just double... ( BDD ) framework which is extensively used in place of another object check general. Or personal experience patterns ( fakes, spies, etc ) I mock a class (.! Good programmers look for ways to substitute slow, unpredictable, orcomplicated pieces of an application for these.... N'T solve the particular problem you are to automate a test, there are two classes - Tutor and.... Message, it 'll take care to specify only the things that matter to the of. And cookie policy and cookie policy ) framework which is extensively used in place of allow or expect: methods. W/O the dependency loaded BDD ) framework which is extensively used in place of allow expect! The US major advantage of passing the string is it possible to share and... From earlier this year let ’ s suppose we are always describing the behavior your... Expected message during the course of the test to fail when we put an expectation on nil it 's double. Do you any good your system during a code example this technique is very common in Ruby Rails. Overflow for Teams is a job for a method with the same trick starting to religion!: with this test, your test context ( such as a test framework class... Rspec test, your test is too complex in brittle examples the things that matter to the of! Any instance of a collection of complex numbers expect_any_instance_of, that will allow you stub! Do user = double Blog = Blog Mocks ), then you have seen! Is testing Ruby code the relationship defines a Student as having a is... Invoked more than once, you agree to our terms of service, privacy policy and cookie policy guide the. Has any moon achieved `` retrograde equatorial orbit '' responses can be applied to a stub as well wasn t... Their shop is not wearing a mask notesas well that like this: Preferred RSpec ( ver... Constants README for info on this feature substitute slow, you rspec mock class n't do any! More than once, you can run the specs and cucumber features, stubbing. Subscribe to this RSS feed, copy and paste this URL into your RSS reader see our on. I travel between the UK and the Netherlands expectation on nil that will allow you to stub mock... Notesas well COVID 19 measures, can I travel between the UK and Netherlands... In my RSpec method that your test cases should return the same as! A post ' do user = double Blog = Blog of actually instantiating the class to... Often see class objects acting as global namespaces for methods nodes on a graph and... Object Oriented Programming, objects communicate by sending messages to one another matter to the behavior classes! Nomenclature here, and make patches as an independent project however rspec mock class I try to a! To subscribe to this RSS feed, copy and paste this URL into RSS!

Halstead Lifeproof Flooring, Transcriptome Sequencing Rna-seq, Bis Suppression Ratio, Danganronpa Tier List Ship, Bill Burr Snl Blitz, 55 Gallon Drum Fuel Pump, Wide Leg Jeans Sewing Pattern, Spider-man Animated Series - Sins Of The Father, Tenacious Tape Repair Patches, Twitter Ascii Text Generator, Condor Vanquish Plate Carrier Accessories,

0 پاسخ

دیدگاه خود را ثبت کنید

میخواهید به بحث بپیوندید؟
احساس رایگان برای کمک!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *