dev-resources.site
for different kinds of informations.
Writing XUnit Tests without Object Arrays
Published at
10/12/2024
Categories
unittest
xunit
Author
xceed
Author
5 person written this
xceed
open
Introduction
In unit testing with XUnit, we often use object arrays for test data. However, managing complex test data can quickly become cumbersome and hard to read. In this post, we’ll explore how to write cleaner and more scalable XUnit tests using TheoryData<T>
without relying on object[]
arrays.
Example Scenario: Retrieving Food by Type
Let's implement a FoodService
class with a method that retrieves food items by type.
public enum FoodType { Fruit, Fast }
public interface IFoodService
{
public IEnumerable<string> GetByType(FoodType type);
}
public class FoodService : IFoodService
{
public IEnumerable<string> GetByType(FoodType type) => type switch
{
FoodType.Fruit => ["Apple", "Banana"],
FoodType.Fast => ["Pizza", "Burger"],
_ => throw new NotImplementedException()
};
}
Here, we use TheoryData<T>
to hold our test cases, defining a FoodTestData
record that includes input parameters, expected results, and a custom name for each test case:
public class FoodTests
{
// override ToString method allow us to specify name for individual tests in TheoryData<T>
public record FoodTestData(FoodType Type, IEnumerable<string> Expected, string TestName)
{
public override string ToString() => TestName;
}
// this method has the input parameters and expected values. we can scale this method with more tests without changes the test itself.
public static TheoryData<FoodTestData> GetFoodTestData() => [
new(Type: FoodType.Fruit, Expected: ["Apple","Banana"], TestName: "Test should return expected fruits"),
new(Type: FoodType.Fast, Expected: ["Pizza","Burger"], TestName: "Test should return expected fast food")
];
[Theory]
[MemberData(nameof(GetFoodTestData))]
public void ShouldReturnExpectedFood(FoodTestData foodTestData)
{
// Arrange
var mockFoodService = new Mock<IFoodService>();
mockFoodService
.Setup(x => x.GetByType(FoodType.Fruit))
.Returns(["Apple", "Banana"]);
// Act
var food = new FoodService().GetByType(foodTestData.Type);
// Assert
Assert.Equal(foodTestData.Expected, food);
}
}
Output
Conclusion
Using TheoryData<T>
with a named record keeps our tests clean, easy to read, and scalable for future test cases.
Thank you for reading.
unittest Article's
30 articles in total
Getting Started with Android Testing: Building Reliable Apps with Confidence (Part 1/3)
read article
What is the Order of Importance for Unit, Integration, and Acceptance Tests in Software Development?
read article
Top 17 Best Unit Testing Tools
read article
JUnit Testing: A Comprehensive Guide to Unit Testing in Java
read article
Crafting Effective Unit Tests for Generative AI Applications
read article
Harder, Better, Faster, Stronger Tests With Fixtures
read article
How To Test Your JavaScript Application With Jest Framework?
read article
Effective Strategies for Writing Unit Tests with External Dependencies like Databases and APIs
read article
Debugging Laravel Routes in Testing
read article
Is Unit Test really a MUST?
read article
Let's Learn Unit Testing in Python with pytest! 🚀
read article
An opinionated testing approach for VueJS
read article
PHP: Should I mock or should I go?
read article
Implementing Unit Testing in ReadmeGenie
read article
8.Angular Unit Testing: A Step-by-Step Approach
read article
“Why Unit Testing Is Not an Option, But a Duty”
read article
Early Raises $5M to Transform Software Development
read article
Smth about Unittests
read article
Unit Testing in Laravel: A Practical Approach for Developers
read article
Assert with Grace: Custom Soft Assertions using AssertJ for Cleaner Code
read article
Writing Integration And Unit Tests for a Simple Fast API application using Pytest
read article
End-To-End Testing for Java+React Applications
read article
Writing XUnit Tests without Object Arrays
currently reading
Comprehensive Testing in .NET 8: Using Moq and In-Memory Databases
read article
Test-Driven Development (TDD) in Front-end.
read article
Unit testing
read article
jUnit - Testes unitários em Java
read article
Testing Spring Boot Applications: Unit, Integration, and Mocking — A Comprehensive Guide
read article
Let’s Make Jest Run Much Faster
read article
Test-Driven Development
read article
Featured ones: