Assert.AreEqual在一个只有一个Setter的属性上,在MVP中进行单元测试

时间:2014-01-24 14:05:31

标签: c# unit-testing moq

当尝试断言属性是否等于某个属性只有一个setter时,我遇到了一个问题。

这是我的视图界面:

public interface ICalculatorView
    {
        int Number1 { get; }
        int Number2 { get; }
        string MathmaticalCalculation { get; set; }
        int Answer { set; }
    }

我只在屏幕上显示Answer并且不使用get访问器,这就是为什么它只在属性上设置了访问器。

这是我实现界面的视图:

CustomerDetailsPresenter _presenter;
        protected void Page_Load(object sender, EventArgs e)
        {
            _presenter = new CustomerDetailsPresenter(this, this, 
                new GetCustomerDetailsModel());
            if (!Page.IsPostBack)
            {
                _presenter.Initialize();
                customerIdDDL.DataSource = ListOfCustomerIds;
                customerIdDDL.DataBind();
            }
        }
        protected void performCalcButton_Click(object sender, EventArgs e)
        {
            MathmaticalCalculation = ((Button)sender).Text;
            _presenter.PerformCalculation();
        }

        public int Number1
        {
            get { return int.Parse(number1TextBox.Text); }
        }

        public int Number2
        {
            get {  return int.Parse(number2TextBox.Text);}
        }

        public string MathmaticalCalculation { get; set; }  

        public int Answer
        {
            set { answerLabel.Text = value.ToString(); }
        }
}

我希望能够在单元测试中对执行计算方法进行单元测试。这是测试方法:

[TestMethod]
        public void TestCalcWorks_AddingTwoNumbers()
        {
            // Arrange
            var mockIDetailsView = new Mock<ICustomerDetailsView>();
            var mockICalculatorView = new Mock<ICalculatorView>();
            var mockIGetCustomerDetailsModel = new Mock<IGetCustomerDetailsModel>();
            var mockTestPresenter = new Mock<CustomerDetailsPresenter>();

            var testPresenter = new CustomerDetailsPresenter(mockIDetailsView.Object,
                mockICalculatorView.Object, mockIGetCustomerDetailsModel.Object);

            mockICalculatorView.Setup(x => x.Number1).Returns(2);
            mockICalculatorView.Setup(x => x.Number2).Returns(2);
            mockICalculatorView.Setup(x => x.MathmaticalCalculation).Returns("+");

            // Act
            testPresenter.PerformCalculation();
            // Assert

            Assert.AreEqual(mockICalculatorView.Object.Answer, 4);
        }

由于mockICalculatorView.Object.Answer没有get访问器,因此无法编译。我知道我可以将它添加到Answer属性,一切都会正常工作。但可以肯定的是,我不需要修改我编写的任何代码,以便我可以运行测试方法,或者我可以吗?

2 个答案:

答案 0 :(得分:1)

看起来你正在使用Moq。你可以这样做(对于断言):

mockICalculatorView.VerifySet(m => m.Answer = 4, Times.Once());

答案 1 :(得分:0)

如果你想测试答案是否为4,当然你必须有一些方法来获得结果。如果该值永远不会保存在任何地方,则无法检索它。