Moq, SetupGet, การเยาะเย้ยคุณสมบัติ


94

ฉันพยายามล้อเลียนคลาสที่เรียกว่า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>>

ความช่วยเหลือใด ๆ จะได้รับการชื่นชม

คำตอบ:


192

ColumnNamesเป็นคุณสมบัติของประเภทList<String>ดังนั้นเมื่อคุณตั้งค่าคุณจะต้องส่งผ่านList<String>การReturnsโทรเป็นอาร์กิวเมนต์ (หรือ func ที่ส่งคืน a List<String>)

แต่ด้วยบรรทัดนี้คุณพยายามที่จะกลับมา string

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

ซึ่งเป็นสาเหตุของข้อยกเว้น

เปลี่ยนเพื่อส่งคืนรายการทั้งหมด:

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

3
ดูเหมือนว่าฉันต้องการพัก ขอบคุณมากสำหรับความช่วยเหลือ! (+1 n จะยอมรับ ur ans ใน 7 นาที)
Hans Rudel

18
SetupGet () คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
imnk

เหมือนกับฉันใช้ SetUpGet () สำหรับคุณสมบัติคลาสและใช้งานได้
hussian

4

แต่ในขณะที่การเยาะเย้ยคุณสมบัติแบบอ่านอย่างเดียวหมายถึงคุณสมบัติที่มีเมธอด getter เท่านั้นที่คุณควรประกาศเป็นเสมือนมิฉะนั้น System.NotSupportedException จะถูกโยนออกไปเนื่องจากรองรับเฉพาะใน VB เท่านั้นเนื่องจาก moq จะแทนที่ภายในและสร้างพร็อกซีเมื่อเราเยาะเย้ยอะไรก็ตาม


1
แล้วเราจะประกาศคุณสมบัติแบบอ่านอย่างเดียวเป็นเสมือนในอินเทอร์เฟซได้อย่างไร?
เกิด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.