Open abatishchev opened 4 days ago
Hi @abatishchev,
By default, MSTest tries to expand the parameterized tests to provide better experience in IDEs. To do so, the current solution is to serialize the data using JSON data contract serializer. Because your data isn't serializable, when reaching the method the data is null.
You could workaround that by adding the [Serializable]
attribute on top of the AccountKind
and if that's a production oriented type that you cannot/don't want to tweak for tests then I recommend to use an intermediate "test" type that would then be converted in the real type within the test method.
When using [TestDataSourceDiscovery(TestDataSourceDiscoveryOption.DuringExecution)]
you are disabling the expansion of the data, removing the need to serialize the data. The result is that multiples results are attached to the same test (as you can see on screenshot 1).
I am not a big fan of the decision that was made to have the data serialized but we cannot easily change that without introducing breaking changes. I want to make some test to see if we could use a workaround to use an index based solution (with a manual optin) to avoid this issue. The only problem with index based solution is that we need the data source to be deterministic (e.g. a randomized data source index is not guaranteeing to produce the same data).
thanks for the detailed explanation, @Evangelink! do you know what's the (primary) reason for the (mis) behavior:
struct
(given that class
works fine, apparently)Sadly, I don't know enough about this serializer to know why it behaves differently.
Describe the bug
Given a struct with an implicit conversion to string (operator overload
And a test method which accepts it as a parameter via a
[DynamicData]
attribute:What happens then:
null
:Notes:
[TestDataSourceDiscovery(TestDataSourceDiscoveryOption.DuringExecution)]
string
(see the attached repro for an example)class
Steps To Reproduce
Attached a sample project: TestProject1.zip
Expected behavior
Test method is executed 3 times, each times receives a parameter with the correct value
Actual behavior
Test method is executed 1 time, it receives a parameter with
null
Additional context
VS 2022 version 17.11.5