9

假设我有以下实体:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public Guid UserGuid { get; set; }
    public Guid ConfirmationGuid { get; set; }
}

以及以下接口方法:

void CreateUser(string username);

部分实现应该创建两个新的 GUID:一个用于UserGuid,另一个用于ConfirmationGuid。他们应该通过将值设置为 来做到这一点Guid.NewGuid()

我已经使用接口抽象了 Guid.NewGuid() :

public interface IGuidService
{
    Guid NewGuid();
}

因此,当只需要一个新的 GUID 时,我可以轻松地模拟它。但我不确定如何从一个方法中模拟对同一方法的两个不同调用,以便它们返回不同的值。

4

2 回答 2

11

如果您使用的是起订量,则可以使用:

mockGuidService.SetupSequence(gs => gs.NewGuid())
    .Returns( ...some value here...)
    .Returns( ...another value here... );

我想您还可以执行以下操作:

mockGuidService.Setup(gs => gs.NewGuid())
    .Returns(() => ...compute a value here...);

尽管如此,除非您只是在返回函数中提供一个随机值,否则顺序知识似乎仍然很重要。

于 2012-07-21T04:06:22.217 回答
4

如果您不能像@Matt 的示例中那样使用 Moq,那么您可以构建自己的类,它基本上可以做同样的事情。

public class GuidSequenceMocker
{
    private readonly IList<Guid> _guidSequence = new[]
                                                     {
                                                         new Guid("{CF0A8C1C-F2D0-41A1-A12C-53D9BE513A1C}"),
                                                         new Guid("{75CC87A6-EF71-491C-BECE-CA3C5FE1DB94}"),
                                                         new Guid("{E471131F-60C0-46F6-A980-11A37BE97473}"),
                                                         new Guid("{48D9AEA3-FDF6-46EE-A0D7-DFCC64D7FCEC}"),
                                                         new Guid("{219BEE77-DD22-4116-B862-9A905C400FEB}") 
                                                     };
    private int _counter = -1;

    public Guid Next()
    {
        _counter++;

        // add in logic here to avoid IndexOutOfRangeException
        return _guidSequence[_counter];
    }
}
于 2012-07-21T04:16:48.213 回答