1

我是 TDD 和单元测试的新手,我有 JustMock 商业版,还有一周的时间来学习如何使用它。下面是一个接口,一个类和一个通过的测试方法。我必须添加 Class1 faceDoesSomething 才能编译它,我还想做一个安排并断言它确实将动作设置为“微笑”。有办法吗?

编辑:我正在使用一个不使用 JustMock 的示例来使用 JustMock 创建解决方案。我意识到该示例测试委托实际上订阅了该事件,因此我需要在担心它返回什么之前这样做。我通过添加测试方法 ClassRegistersAsListenerForDoesSomethingEvent 修改了下面的代码,使其更接近我正在使用的示例。我相信我错过了一个断言,但我不确定。我知道测试失败了,所以我做对了。

在这个过程中的某个时刻,我是否真的开始在真实类上使用测试,而不仅仅是在模拟上?

public delegate void IFace1EventDelegate(object sender, IFace1 face);
public interface IFace1
{
    string Action { get; set; }
    int DoesSomethingListenerCount { get; }
    event IFace1EventDelegate DoesSomething;
}    

public class Class1
{
    public event IFace1EventDelegate DoesSomething;
    IFace1 face;
    private string action = string.Empty;
    public Class1(IFace1 Face)
{
    face = Face;
    face.DoesSomething += new IFace1EventDelegate(faceDoesSomething);
}
    public string Action
    {
        get { return action; }
        set { action = value; }
    }
    public int DoesSomethingListenerCount
    {
        get
        {
            if (DoesSomething != null)
            {
                return DoesSomething.GetInvocationList().Count();
            }
            return 0;
        }
    }
    private void faceDoesSomething(object sender, IFace1 face)
    {
    }
}

[TestMethod]
public void FaceShouldSmile()
{
    // arrange
    var Smiley = Mock.Create<IFace1>();
    var Classy = Mock.Create<Class1>(Smiley);
    Mock.Arrange(() => Classy.Action).Returns("Frown");
    // act
    string s = Classy.Action;
    // assert
    Assert.AreEqual("Frown", s);
}
[TestMethod]
public void ClassRegistersAsListenerForDoesSomethingEvent()
{
    // arrange
    var Smiley = Mock.Create<IFace1>();
    var Classy = Mock.Create<Class1>(Smiley);
    // act
    int listenersCountAfter = 1;
    int actualListenersCount = Classy.DoesSomethingListenerCount;
    // assert
    Assert.AreEqual(listenersCountAfter, actualListenersCount);
}
4

1 回答 1

2

我正在通过阅读“单元测试的艺术”来学习单元测试,并且也被困在模拟事件订阅中。但是在使用方法和参数之后,我找到了解决方案:

[Test]
public void VerifyAttachesToViewEvents()
{
    var viewMock = Mock.Create<IView>();
    Mock.ArrangeSet(() => viewMock.Load += null).IgnoreArguments().OccursOnce();
    var presenter = new Presenter(viewMock);
    Mock.AssertAll(viewMock);
}
于 2013-06-22T16:14:00.227 回答