Moq, SetupGet, एक संपत्ति का मज़ाक करना


99

मैं एक वर्ग को मॉक करने की कोशिश कर रहा हूं, जिसे बुलाया जाता है UserInputEntity, जिसमें एक संपत्ति होती है जिसे कहा जाता है ColumnNames: (इसमें अन्य गुण शामिल हैं, मैंने इसे प्रश्न के लिए सरल बनाया है)

namespace CsvImporter.Entity
{
    public interface IUserInputEntity
    {
        List<String> ColumnNames { get; set; }
    }

    public class UserInputEntity : IUserInputEntity
    {
        public UserInputEntity(List<String> columnNameInputs)
        {
            ColumnNames = columnNameInputs;
        }

        public List<String> ColumnNames { get; set; }
    }
}

मेरे पास एक प्रस्तुतकर्ता वर्ग है:

namespace CsvImporter.UserInterface
{
    public interface IMainPresenterHelper
    {
        //...
    }

    public class MainPresenterHelper:IMainPresenterHelper
    {
        //....
    }

    public class MainPresenter
    {
        UserInputEntity inputs;

        IFileDialog _dialog;
        IMainForm _view;
        IMainPresenterHelper _helper;

        public MainPresenter(IMainForm view, IFileDialog dialog, IMainPresenterHelper helper)
        {
            _view = view;
            _dialog = dialog;
            _helper = helper;
            view.ComposeCollectionOfControls += ComposeCollectionOfControls;
            view.SelectCsvFilePath += SelectCsvFilePath;
            view.SelectErrorLogFilePath += SelectErrorLogFilePath;
            view.DataVerification += DataVerification;
        }


        public bool testMethod(IUserInputEntity input)
        {
            if (inputs.ColumnNames[0] == "testing")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

मैंने निम्नलिखित परीक्षण की कोशिश की है, जहां मैं इकाई का मजाक उड़ाता हूं, ColumnNamesएक प्रारंभिक वापस करने के लिए संपत्ति प्राप्त करने की कोशिश करता हूं, List<string>()लेकिन यह काम नहीं कर रहा है:

    [Test]
    public void TestMethod_ReturnsTrue()
    {
        Mock<IMainForm> view = new Mock<IMainForm>();
        Mock<IFileDialog> dialog = new Mock<IFileDialog>();
        Mock<IMainPresenterHelper> helper = new Mock<IMainPresenterHelper>();

        MainPresenter presenter = new MainPresenter(view.Object, dialog.Object, helper.Object);

        List<String> temp = new List<string>();
        temp.Add("testing");

        Mock<IUserInputEntity> input = new Mock<IUserInputEntity>();

    //Errors occur on the below line.
        input.SetupGet(x => x.ColumnNames).Returns(temp[0]);

        bool testing = presenter.testMethod(input.Object);
        Assert.AreEqual(testing, true);
    }

मुझे जो त्रुटियां मिली हैं, वे बताती हैं कि कुछ अमान्य तर्क हैं + तर्क 1 को स्ट्रिंग से परिवर्तित नहीं किया जा सकता है

System.Func<System.Collection.Generic.List<string>>

किसी भी सहायता की सराहना की जाएगी।

जवाबों:


199

ColumnNamesएक प्रकार की संपत्ति है, List<String>इसलिए जब आप सेट कर रहे हों तो आपको कॉल में एक तर्क के रूप List<String>में पारित करने की आवश्यकता होती Returnsहै (या एक वापसी जो एक वापसी है List<String>)

लेकिन इस लाइन के साथ आप सिर्फ एक वापसी की कोशिश कर रहे हैं string

input.SetupGet(x => x.ColumnNames).Returns(temp[0]);

जो अपवाद पैदा कर रहा है।

पूरी सूची वापस करने के लिए इसे बदलें:

input.SetupGet(x => x.ColumnNames).Returns(temp);

3
लगता है मुझे ब्रेक की जरूरत है। आपकी सहायता के लिए बहुत धन्यवाद! (+1 एन 7 एमिंस में उर एन्स को स्वीकार करेंगे)
हंस रुडेल

18
SetupGet () वही था जिसकी मुझे तलाश थी। धन्यवाद!
जुन्न 5'15 को

मेरे समान, वर्ग संपत्ति के लिए SetUpGet () का उपयोग किया गया और यह काम करता है।
हुसैन

4

लेकिन केवल पढ़ने के लिए गुणों का मजाक उड़ाने का मतलब है कि गटर विधि के साथ गुण केवल आपको इसे आभासी घोषित करना चाहिए अन्यथा System.NotSupportedException को फेंक दिया जाएगा क्योंकि यह केवल VB में moq आंतरिक रूप से ओवरराइड के रूप में समर्थित है और कुछ भी नकली होने पर प्रॉक्सी बनाते हैं।


1
तो एक इंटरफ़ेस में एक रीड-ओनली प्रॉपर्टी को वर्चुअल कैसे घोषित किया जाता है?
erict
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.