我有一个带有2个方法的ProductRepository,GetAllProducts和GetProductByType,我想在GetProductByType上测试逻辑.在内部,GetProductByType调用GetAllProducts,然后过滤正确的.
public virtual IEnumerable<Product> GetAllProducts()
{
//returns all products in memory, db etc
}
public virtual IEnumerable<Product> GetProductsByType(string type)
{
return (from p in GetAllProducts() where p.Type == type select p).ToList();
}
Run Code Online (Sandbox Code Playgroud)
因此,在我的测试中,我想模拟对GetAllProducts的调用,因此它返回在我的测试中定义的产品列表,然后调用原始的GetProductsByType,它将使用模拟的GetAllProducts.
我正在尝试类似下面的代码,但原始的GetProductByType没有被执行,它也被模拟了.在TypeMock中,我有一个CallOriginal方法来解决这个问题,但我无法用Moq来解决这个问题.有任何想法吗?
var mock = new Mock<ProductRepository>();
mock.Setup(r => r.GetAllProducts()).Returns(new List<Product>() {p1, p2, p3});
var result = mock.Object.GetProductsByType("Type1");
Assert.AreEqual(2, result.Count());
Run Code Online (Sandbox Code Playgroud) 我有一个界面
public interface IDataProvider
{
T GetDataDocument<T>(Guid document) where T:class, new()
}
Run Code Online (Sandbox Code Playgroud)
我想以某种方式模拟它,它只会返回给定类型的新实例,而不管确切的类型,如:
myMock.Setup(m => m.GetDataDocument<It.IsAny<Type>()>(It.IsAny<Guid>()))
.Returns(() => new T());
Run Code Online (Sandbox Code Playgroud)
(当然不起作用,因为我不能只给moq提供任何类型参数,我不知道必须返回哪种类型.
关于这个的任何想法?
我正在尝试设置一个模拟DbSet用于测试目的.我在这里使用了这个教程,http://www.loganfranken.com/blog/517/mocking-dbset-queries-in-ef6/并略微修改了它,所以每次调用GetEnumerator都会返回一个新的枚举器(我遇到的另一个问题) .但是,我在向DbSet添加项目时遇到困难.
输出是preCount = 3 postCount = 3.但是,我希望它是precount = 3 postCount = 4.非常感谢任何帮助.
static void Main(string[] args)
{
Debug.WriteLine("hello debug");
List<string> stringList = new List<string>
{
"a", "b", "c"
};
DbSet<string> myDbSet = GetQueryableMockDbSet(stringList);
int preCount = myDbSet.Count();
myDbSet.Add("d");
int postCount = myDbSet.Count();
Debug.WriteLine("preCount = " + preCount + " postCount = " + postCount);
}
private static DbSet<T> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider); …Run Code Online (Sandbox Code Playgroud) 我正在使用shanselmann的MvcMockHelper类来使用Moq模拟一些HttpContext的东西,但我遇到的问题是能够在我的MVC控制器中为我的模拟会话对象分配一些东西,然后能够在我的单元测试中读取相同的值以进行验证目的.
我的问题是如何将存储集合分配给模拟的会话对象,以允许诸如session ["UserName"] ="foo"之类的代码保留"foo"值并使其在单元测试中可用.
我找不到Moq和Rhino的特定功能比较.所有的问题都是"你更喜欢哪些以及为什么",或者"这里是你如何在犀牛中进行简单的模拟以及如何在moq中完成".
我无法在任何地方找到深刻的比较.我知道语法上的差异,我不是在寻找答案. 我正在寻找能力比较.例如:
Rhino有Expect.On()用于线程模拟.Moq可以这样做吗?
那么多模拟(用一个模拟实现多个接口).Moq可以这样做吗?
我相信Moq现在可以模拟受保护的成员.犀牛可以这样做吗?
编辑:我最后还看了一些其他.Net框架.
考虑这个课程:
public class Content
{
public virtual bool IsCheckedOut {get; private set;}
public virtual void CheckOut()
{
IsCheckedOut = true;
}
public virtual void CheckIn()
{
//Do Nothing for now as demonstrating false positive test.
}
}
Run Code Online (Sandbox Code Playgroud)
Checkin方法故意为空.现在我有一些测试方法来验证调用每个方法的状态.
[TestMethod]
public void CheckOutSetsCheckedOutStatusToTrue()
{
Content c = new Content();
c.CheckOut();
Assert.AreEqual(true, c.IsCheckedOut); //Test works as expected
}
[TestMethod]
public void CheckInSetsCheckedOutStatusToFalse()
{
Content c = new Content();
c.CheckIn();
Assert.AreEqual(false, c.IsCheckedOut); //Test does not work as expected
}
Run Code Online (Sandbox Code Playgroud)
第二次测试通过了错误的原因.那么我如何使用mocking(moq)来验证CheckIn是否设置了IsCheckedOut属性?
谢谢.
编辑
澄清一下:我有一个名为CheckIn()的方法,其工作是将IsCheckedOut状态设置为false. …
我在Moq看到了Verifiable()的目的是什么?在我的脑海里有这个问题.需要你的帮助解释一下.
有没有人想出了一个成功的嘲弄解决方案UserManager和RoleManager?我整天都在靠墙打我的头.我想要做的就是模拟对象以使用内存集合而不是命中Entity Framework数据存储.我已经浏览了互联网并尝试了几种使用MOQ的不同方法.
我的印象是新东西更容易测试.我错过了什么吗?
由于我已将我的WCF方法转换为Async,因此我的单元测试失败了,我无法找出正确的语法来使它们工作.
Cllient代理类
public interface IClientProxy
{
Task DoSomething(CredentialDataList credentialData, string store);
}
Run Code Online (Sandbox Code Playgroud)
服务类
public class CredentialSync : ICredentialSync
{
private ICredentialRepository _repository;
private IClientProxy _client;
public CredentialSync()
{
this._repository = new CredentialRepository();
this._client = new ClientProxy();
}
public CredentialSync(ICredentialRepository repository, IClientProxy client)
{
this._repository = repository;
this._client = client;
}
public async Task Synchronise(string payrollNumber)
{
try
{
if (string.IsNullOrEmpty(payrollNumber))
{
.... some code
}
else
{
CredentialDataList credentialData = new CredentialDataList();
List<CredentialData> credentialList = new List<CredentialData>();
// fetch the …Run Code Online (Sandbox Code Playgroud) 我想用Moq设置一个方法两次,但似乎最后一个覆盖了之前的方法.这是我的初始设置:
string username = "foo";
string password = "bar";
var principal = new GenericPrincipal(
new GenericIdentity(username),
new[] { "Admin" });
var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
ms.ValidateUser(username, password)
).Returns(new ValidUserContext {
Principal = principal
});
Run Code Online (Sandbox Code Playgroud)
这很好但我希望这返回new ValidUserContext()如果用户名或密码而不是上面的username和password变量.为此,我添加了另一个设置,但这次它会覆盖上面的设置并始终应用它:
membershipServiceMock.Setup(ms =>
ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns(
new ValidUserContext()
);
Run Code Online (Sandbox Code Playgroud)
使用Moq处理此类情况的最优雅方式是什么?
编辑
我通过以下方法解决了问题,但我想有更好的方法来处理这个问题:
var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns<string, string>((u, p) =>
(u == username && p == password) ?
new ValidUserContext {
Principal …Run Code Online (Sandbox Code Playgroud) moq ×10
c# ×7
unit-testing ×4
.net ×3
mocking ×3
tdd ×2
asp.net-mvc ×1
async-await ×1
asynchronous ×1
dbset ×1
linq ×1
nmock2 ×1
rhino-mocks ×1
typemock ×1