Jer*_*ose 7 c# tdd unit-testing moq mocking
假设我有以下实体:
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public Guid UserGuid { get; set; }
public Guid ConfirmationGuid { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下接口方法:
void CreateUser(string username);
Run Code Online (Sandbox Code Playgroud)
部分实现应该创建两个新的GUID:一个用于UserGuid,另一个用于ConfirmationGuid.他们应该通过将值设置为来完成此操作Guid.NewGuid().
我已经使用接口抽象了Guid.NewGuid():
public interface IGuidService
{
Guid NewGuid();
}
Run Code Online (Sandbox Code Playgroud)
因此,当只需要一个新的GUID时,我可以轻松地模拟它.但是我不确定如何在一个方法中模拟对同一方法的两个不同的调用,以便它们返回不同的值.
Mat*_*t H 10
如果您使用Moq,您可以使用:
mockGuidService.SetupSequence(gs => gs.NewGuid())
.Returns( ...some value here...)
.Returns( ...another value here... );
Run Code Online (Sandbox Code Playgroud)
我想你也可以做以下事情:
mockGuidService.Setup(gs => gs.NewGuid())
.Returns(() => ...compute a value here...);
Run Code Online (Sandbox Code Playgroud)
尽管如此,除非您只是在返回函数中提供随机值,否则对顺序的了解似乎仍然很重要.
如果您不能像 @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];
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4795 次 |
| 最近记录: |