[英]Moq - Create mocked instance for constructor injected object
我想为Credentials
类创建一个单元测试,它在执行Calculate()
方法后验证给定凭据的密码,它等于由实现IPasswordCalculator
接口的对象计算的密码。
实际上,我创建的模拟对象在调用Calculate(ICredentials)
方法时返回string.Empty
值,而不是Pa$$w0rd
,这将是所需的返回值。
然后...
Pa$$w0rd
? 提前致谢。
IPasswordCalculator接口
/// <summary>
/// The password calculator interface.
/// </summary>
public interface IPasswordCalculator
{
/// <summary>
/// Calculates the user password using
/// <paramref name="credentials"/> instance.
/// </summary>
/// <param name="credentials">
/// <see cref="ICredentials"/> to perform the calculation.
/// </param>
void Calculate(ICredentials credentials);
}
ICredentials界面
/// <summary>
/// The Credentials interface.
/// </summary>
public interface ICredentials
{
/// <summary>
/// Gets or sets the user password.
/// </summary>
string Password { get; set; }
/// <summary>
/// Gets the user name.
/// </summary>
string Username { get; }
/// <summary>
/// Calculates the password.
/// </summary>
void Calculate();
}
凭证实施
/// <summary>
/// User credentials.
/// </summary>
public sealed class Credentials : ICredentials
{
/// <summary>
/// Initializes a new instance of the <see cref="Credentials" /> class.
/// </summary>
/// <param name="passwordCalculator">
/// The credentials calculator.
/// </param>
/// <param name="username">
/// The user name.
/// </param>
public Credentials(IPasswordCalculator passwordCalculator, string username)
{
this.Calculator = passwordCalculator;
this.Username = username;
this.Password = string.Empty;
}
/// <summary>
/// Calculates the password.
/// </summary>
public void Calculate()
{
if (null != this.Calculator)
{
this.Calculator.Calculate(this);
}
}
}
测试
/// <summary>
/// Calculate should set password value expected using calculator.
/// </summary>
[TestMethod]
public void CalculateShouldSetPasswordValueExpectedUsingCalculator()
{
ICredentials credentials = null;
var repo = new MockRepository(MockBehavior.Default);
var mock = repo.Create<IPasswordCalculator>();
mock.Setup(x => x.Calculate(credentials))
.Callback(() => { credentials.Password = "Pa$$w0rd"; });
IPasswordCalculator calculator = mock.Object;
credentials = new Credentials(calculator, "Me");
credentials.Calculate();
Assert.AreEqual("Pa$$w0rd", credentials.Password); // Fail
}
您需要以下列方式设置模拟
mock.Setup(x => x.Calculate(It.IsAny<ICredentials>()))
.Callback((ICredentials c) => { c.Password = "Pa$$w0rd"; });
因此,您告诉它“无论您获得什么ICredentials
作为Calculate
方法的参数,将其Password
设置为'Pa $$ word'”
我想你需要在调用mock.Setup()之前初始化credentials变量。 使用您的代码,Moq需要一个调用凭证.Calculate(null)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.