Watson Retrieve & Rank : Difference in answer when asked using Web UI versus an application - ibm-watson

Please see this JSON returned when asked the question : What are the basic methods of Optional ? This is not the perfect match answer that is being returned in the Retrieve and Rank Tooling ( pasted below this JSON snippet). Can you please help me understand why this is happening?
{
"context": {
"conversation_id": "f87c08f1-2122-4d44-b0bc-d05cd458162d",
"system": {
"dialog_stack": "[root]",
"dialog_turn_counter": "1.0",
"dialog_request_counter": "1.0"
}
},
"inquiryText": "what are the basic methods of Optional",
"responseText": "Going to get answers from Devoxx corpus, ",
"resources": [
{
"id": "\"50a305ba-f8fd-4470-afde-884df5170e29\"",
"score": "1.5568095",
"title": "\"no-title\"",
"body": "\"Voxxed JUnit 5 – The Basics Nicolai Parlog 5 months ago Categories: Methodology Tags: java , JUnit , JUnit 5 19 SHARES Facebook Twitter Reddit Google Mail Linkedin Digg Stumbleupon Buffer Last time, we  set up JUnit 5 to be able to write tests. So let’s do it! Overview This post is part of a series about JUnit 5: Setup Basics Architecture Conditions Injection … Most of what you will read here and more can be found in the emerging JUnit 5 user guide . Note that it is based on an alpha version and hence subject to change.Indeed, we are encouraged to open issues or pull requests so that JUnit 5 can improve further. Please make use of this opportunity! It is our chance to help JUnit help us, so if something you see here could be improved, make sure to take it upeam .This post will get updated when it becomes necessary. The code samples I show here can be found on GitHub . Philosophy The new architecture, which we will discuss another time, is aimed at extensibility. It is possible that someday very alien (at least to us run-of-the-mill Java devs) testing techniques will be possible with JUnit 5. But for now the basics are very similar to the current version 4. JUnit 5’s surface undergoes a deliberately incremental improvement and developers should feel right at home. At least I do and I think you will, too: Basic Lifecycle And Features class Lifecycle { #BeforeAll static void initializeExternalResources() { System.out.println(\\\"Initializing external resources...\\\"); } #BeforeEach void initializeMockObjects() { System.out.println(\\\"Initializing mock objects...\\\"); } #Test void someTest() { System.out.println(\\\"Running some test...\\\"); assertTrue(true); } #Test void otherTest() { assumeTrue(true); System.out.println(\\\"Running another test...\\\"); assertNotEquals(1, 42, \\\"Why wouldn't these be the same?\\\"); } #Test #Disabled void disabledTest() { System.exit(1); } #AfterEach void tearDown() { System.out.println(\\\"Tearing down...\\\"); } #AfterAll static void freeExternalResources() { System.out.println(\\\"Freeing external resources...\\\"); } } See? No big surprises. The Basics Of JUnit 5 Visibility The most obvious change is that test classes and methods do not have to be public anymore. Package visibility suffices but private does not. I think this is a sensible choice and in line with how we intuit the different visibility modifiers. Great! I’d say, less letters to type but you haven’t been doing that manually anyways, right? Still less boilerplate to ignore while scrolling through a test class. Test Lifecycle #Test The most basic JUnit annotation is #Test, which marks methods that are to be run as tests. It is virtually unchanged, although it no longer takes optional arguments. Expected exceptions can now be verified via assertions but as far as I know there is not yet a replacement for timeouts . JUnit 5 creates a new test instance for each test method (same as JUnit 4). Before And After You might want to run code to set up and tear down your tests. There are four method annotations to help you do that: #BeforeAll Executed once; runs before the tests and methods marked with #BeforeEach. #BeforeEach Executed before each test. #AfterEach Executed after each test. #AfterAll Executed once; runs after all tests and methods marked with #AfterEach. Because a new instance is created for each test, there is no obvious instance on which to call the #BeforeAll/ #AfterAll methods, so they have to be static. The order in which different methods annotated with the same annotation are executed is undefined. As far as I can tell the same is true for inherited methods. Whether it should be possible to define an order is currently being discussed . Except in name, these annotations work exactly like in JUnit 4. While not  uncommon , I am not convinced of the names, though. See this issue for details. Disabling Tests It’s Friday afternoon and you just want to go home? No problem, just slap#Disabled on the test (optionally giving a reason) and run. A Disabled Test #Test #Disabled(\\\"Y U No Pass?!\\\") void failingTest() { assertTrue(false); } Test Class Lifecycle Compared to the prototype it is interesting to note that the test class lifecycle didn’t make it into the alpha version. It would run all tests on the same instance of the test class, thus allowing the tests to interact with each other by mutating state. As I already wrote while discussing the prototype: I think this is a typical case of a feature that is harmful in 99% of the cases but indispensable in the other 1%. Considering the very real risk of horrible inter-test-dependencies I’d say it was a good thing that it was taken out in its original form. But the JUnit team is discussing  ways to bring it back in with a different name and added semantics. This would make its use very deliberate. What do you think? Assertions If #Test, #Before..., and #After... are a test suite’s skeleton, assertions are its heart. After the instance under test was prepared and the functionality to test was executed on it, assertions make sure that the desired properties hold. If they don’t, they fail the running test. Classic Classic assertions either check a property of a single instance (e.g. that it is not null) or do some kind of comparison (e.g. that two instances are equal). In both cases they optionally take a message as a last parameter, which is shown when the assertion fails. If constructing the message is expensive, it can be specified as a lambda expression, so construction is delayed until the message is actually required. Classic Assertions #Test void assertWithBoolean() { assertTrue(true); assertTrue(this::truism); assertFalse(false, () -> \\\"Really \\\" + \\\"expensive \\\" + \\\"message\\\" + \\\".\\\"); } boolean truism() { return true; } #Test void assertWithComparison() { List expected = asList(\\\"element\\\"); List actual = new LinkedList<>(expected); assertEquals(expected, actual); assertEquals(expected, actual, \\\"Should be equal.\\\"); assertEquals(expected, actual, () -> \\\"Should \\\" + \\\"be \\\" + \\\"equal.\\\"); assertNotSame(expected, actual, \\\"Obviously not the same instance.\\\"); } As you can see JUnit 5 doesn’t change much here. The names are the same as before and comparative assertions still take a pair of an expected and an actual value (in that order). That the expected-actual order is so critical in understanding the test’s failure message and intention, but can be mixed up so easily is a big blind spot. There’s nothing much to do, though, except to create a new assertion framework. Considering big players like Hamcrest (ugh!) or AssertJ (yeah!), this would not have been a sensible way to invest the limited time. Hence the goal was to keep the assertions focused and effort-free. New is that failure message come last. I like it because it keeps the eye on the ball, i.e. the property being asserted. As a nod to Java 8, Boolean assertions now accept  suppliers , which is a nice detail. Extended Aside from the classical assertions that check specific properties, there are a couple of others. The first is not even a real assertion, it just fails the test with a failure message. 'fail' #Test void failTheTest() { fail(\\\"epicly\\\"); } Then we have assertAll, which takes a variable number of assertions and tests them all before reporting which failed (if any). #Test void assertAllProperties() { Address address = new Address(\\\"New City\\\", \\\"Some Street\\\", \\\"No\\\"); assertAll(\\\"address\\\", () -> assertEquals(\\\"Neustadt\\\", address.city), () -> assertEquals(\\\"Irgendeinestraße\\\", address.street), () -> assertEquals(\\\"Nr\\\", address.number) ); } Failure Message for ‘AssertALL’ org.opentest4j.MultipleFailuresError: address (3 failures) expected: but was: expected: but was: expected: but was: This is great to check a number of related properties and get values for all of them as opposed to the common behavior where the test reports the first one that failed and you never know the other values. Finally we have assertThrows and expectThrows. Both fail the test if the given method does not throw the specified exception. The latter also returns the exceptions so it can be used for further verifications, e.g. asserting that the message contains certain information. #Test void assertExceptions() { assertThrows(Exception.class, this::throwing); Exception exception = expectThrows(Exception.class, this::throwing); assertEquals(\\\"Because I can!\\\", exception.getMessage()); } Assumptions Assumptions allow to only run tests if certain conditions are as expected. This can be used to reduce the run time and verbosity of test suites, especially in the failure case. #Test void exitIfFalseIsTrue() { assumeTrue(false); System.exit(1); } #Test void exitIfTrueIsFalse() { assumeFalse(this::truism); System.exit(1); } private boolean truism() { return true; } #Test void exitIfNullEqualsString() { assumingThat( \\\"null\\\".equals(null), () -> System.exit(1) ); } Assumptions can either be used to abort tests whose preconditions are not met or to execute (parts of) a test only if a condition holds. The main difference is that aborted tests are reported as disabled, whereas a test that was empty because a condition did not hold is plain green. Nesting Tests JUnit 5 makes it near effortless to nest test classes. Simply annotate inner classes with #Nested and all test methods in there will be executed as well: package org.codefx.demo.junit5;// NOT_PUBLISHED import org.junit.gen5.api.BeforeEach; import org.junit.gen5.api.Nested; import org.junit.gen5.api.Test; import static org.junit.gen5.api.Assertions.assertEquals; import static org.junit.gen5.api.Assertions.assertTrue; class Nest { int count = Integer.MIN_VALUE; #BeforeEach void setCountToZero() { count = 0; } #Test void countIsZero() { assertEquals(0, count); } #Nested class CountGreaterZero { #BeforeEach void increaseCount() { count++; } #Test void countIsGreaterZero() { assertTrue(count > 0); } #Nested class CountMuchGreaterZero { #BeforeEach void increaseCount() { count += Integer.MAX_VALUE / 2; } #Test void countIsLarge() { assertTrue(count > Integer.MAX_VALUE / 2); } } } } As you can see, #BeforeEach (and #AfterEach) work here as well. Although currently not documented the initializations are executed outside-in. This allows to incrementally build a context for the inner tests. For nested tests to have access to the outer test class’ fields, the nested class must not be static. Unfortunately this forbids the use of static methods so #BeforeAll and#AfterAll can not be used in that scenario. ( Or can they? ) Maybe you’re asking yourself what this is good for. I use nested test classes to inherit interface tests , others to keep their test classes small and focused . The latter is also demonstrated by the more elaborate example commonly given by the JUnit team , which tests a stack: class TestingAStack { Stack stack; boolean isRun = false; #Test void isInstantiatedWithNew() { new Stack(); } #Nested class WhenNew { #BeforeEach void init() { stack = new Stack(); } // some tests on 'stack', which is empty #Nested class AfterPushing { String anElement = \\\"an element\\\"; #BeforeEach void init() { stack.push(anElement); } // some tests on 'stack', which has one element... } } } In this example the state is successively changed and a number of tests are executed for each scenario. Naming Tests JUnit 5 comes with an annotation #DisplayName, which gives developers the possibility to give more easily readable names to their test classes and methods. With it, the stack example which looks as follows: #DisplayName(\\\"A stack\\\") class TestingAStack { #Test #DisplayName(\\\"is instantiated with new Stack()\\\") void isInstantiatedWithNew() { /*…*/ } #Nested #DisplayName(\\\"when new\\\") class WhenNew { #Test #DisplayName(\\\"is empty\\\") void isEmpty() { /*…*/ } #Test #DisplayName(\\\"throws EmptyStackException when popped\\\") void throwsExceptionWhenPopped() { /*…*/ } #Test #DisplayName(\\\"throws EmptyStackException when peeked\\\") void throwsExceptionWhenPeeked() { /*…*/ } #Nested #DisplayName(\\\"after pushing an element\\\") class AfterPushing { #Test #DisplayName(\\\"it is no longer empty\\\") void isEmpty() { /*…*/ } #Test #DisplayName(\\\"returns the element when popped and is empty\\\") void returnElementWhenPopped() { /*…*/ } #Test #DisplayName( \\\"returns the element when peeked but remains not empty\\\") void returnElementWhenPeeked(){ /*…*/ } } } } This creates nicely readable output and should bring joy to the heart of BDD ‘ers! Reflection That’s it, you made it! We rushed through the basics of how to use JUnit 5 and now you know all you need to write plain tests: How to annotate the lifecycle methods (with #[Before|After][All|Each]) and the test methods themselves ( #Test), how to nest ( #Nested) and name ( #DisplayName) tests and how assertions and assumptions work (much like before). But wait, there’s more! We didn’t yet talk about conditional execution of tests methods, the very cool parameter injection, the extension mechanism, or the project’s architecture. And we won’t right now because we will take a short break from JUnit 5 and come back to it in about a month. Stay tuned! Window size: x Viewport size: x\"",
"docName": "\"JUnit 5 – The Basics - Voxxed.htm\""
},
{
"id": "\"0054b4e9-6b55-420e-84bc-8f31c79a949f\"",
"score": "1.2038735",
"title": "\"By Stefan Bulzan\"",
"body": "\"With the advent of lambdas in Java we now have a new tool to better design our code. Of course, the first step is using streams, method references and other neat features introduced in Java 8. Going forward I think the next step is to revisit the well established Design Patterns and see them through the functional programming lenses. For this purpose I’ll take the Decorator Pattern and implement it using lambdas. We’ll take an easy and delicious example of the Decorator Pattern: adding toppings to pizza. Here is the standard implementation as suggested by GoF: First we have the interface that defines our component: public interface Pizza { String bakePizza(); } We have a concrete component: public class BasicPizza implements Pizza { #Override public String bakePizza() { return \\\"Basic Pizza\\\"; } } We decide that we have to decorate our component in different ways. We go with Decorator Pattern. This is the abstract decorator: public abstract class PizzaDecorator implements Pizza { private final Pizza pizza; protected PizzaDecorator(Pizza pizza) { this.pizza = pizza; } #Override public String bakePizza() { return pizza.bakePizza(); } } We provide some concrete decorators for the component: public class ChickenTikkaPizza extends PizzaDecorator { protected ChickenTikkaPizza(Pizza pizza) { super(pizza); } #Override public String bakePizza() { return super.bakePizza() + \\\" with chicken topping\\\"; } } public class ProsciuttoPizza extends PizzaDecorator { protected ProsciuttoPizza(Pizza pizza) { super(pizza); } #Override public String bakePizza() { return super.bakePizza() + \\\" with prosciutto\\\"; } } And this is the way to use the new structure: Pizza pizza = new ChickenTikkaPizza(new BasicPizza()); String finishedPizza = pizza.bakePizza(); //Basic Pizza with chicken topping pizza = new ChickenTikkaPizza(new ProsciuttoPizza(new BasicPizza())); finishedPizza = pizza.bakePizza(); //Basic Pizza with prosciutto with chicken topping We can see that this can get very messy, and it did get very messy if we think about how we handle buffered readers in Java: new DataInputStream(new BufferedInputStream(new FileInputStream(new File(\\\"myfile.txt\\\")))) Of course, you can split that in multiple lines, but that won’t solve the messiness, it will just spread it. Now lets see how we can do the same thing using lambdas. We start with the same basic component objects: public interface Pizza { String bakePizza(); } public class BasicPizza implements Pizza { #Override public String bakePizza() { return \\\"Basic Pizza\\\"; } } But now instead of declaring an abstract class that will provide the template for decorations, we will create the decorator that asks the user for functions that will decorate the component. public class PizzaDecorator { private final Function toppings; private PizzaDecorator(Function... desiredToppings) { this.toppings = Stream.of(desiredToppings) .reduce(Function.identity(), Function::andThen); } public static String bakePizza(Pizza pizza, Function... desiredToppings) { return new PizzaDecorator(desiredToppings).bakePizza(pizza); } private String bakePizza(Pizza pizza) { return this.toppings.apply(pizza).bakePizza(); } } There is this line that constructs the chain of decorations to be applied: Stream.of(desiredToppings).reduce(identity(), Function::andThen); This line of code will take your decorations (which are of Function type) and chain them using andThen. This is the same as… (currentToppings, nextTopping) -> currentToppings.andThen(nextTopping) And it makes sure that the functions are called subsequently in the order you provided. Also, Function.identity() is translated to elem -> elem lambda expression. OK, now where will we define our decorations? Well, you can add them as static methods in PizzaDecorator or even in the interface: public interface Pizza { String bakePizza(); static Pizza withChickenTikka(Pizza pizza) { return new Pizza() { #Override public String bakePizza() { return pizza.bakePizza() + \\\" with chicken\\\"; } }; } static Pizza withProsciutto(Pizza pizza) { return new Pizza() { #Override public String bakePizza() { return pizza.bakePizza() + \\\" with prosciutto\\\"; } }; } } And now, this is how this pattern gets to be used: String finishedPizza = PizzaDecorator.bakePizza(new BasicPizza(),Pizza::withChickenTikka, Pizza::withProsciutto); //And if you static import PizzaDecorator.bakePizza: String finishedPizza = bakePizza(new BasicPizza(),Pizza::withChickenTikka, Pizza::withProsciutto); As you can see, the code got more clear and more concise, and we didn’t use inheritance to build our decorators. This is just one of the many design patterns that can be improved using lambdas. There are more features that can be used to improve the rest of them like using partial application (currying) to implement Adapter Pattern. I hope I got you thinking about adopting a more functional programming approach to your development style.\"",
"docName": "\"Decorator Design Pattern Using Lambdas - Voxxed.htm\""
}
]
}

When you submit a query to R&R with a trained ranker id, it will take the responses from the retrieve side of the service, and use the ranker to sort them into order based on what the ranker has "learned" about relevance.
The number of rows you fetch from the retrieve service in the first place is crucial for this.
To take the extreme case as an example, if you fetch only one row, it doesn't matter what training you've given the ranker. It has one thing to sort into order. So it will return that one thing.
If you fetch a small number of rows, for example 3, you will retrieve those three rows, and then the ranker will sort them. You will always get the same three rows - the difference the ranker makes will be what order they come in.
If you fetch a very large number of rows, for example 100, the ranker has 100 results to sort into order, so the top answer from such a query may well be different to what the top answer would be if you'd only fetched the top few.
When comparing the top result from two different apps querying the R&R service, it's therefore essential to take the rows parameter into account.
The web tooling you included a screenshot of uses a rows parameter of 30. It's retrieving 30 rows, and then using the ranker you've selected to sort them into order and display the top results.
My guess is that your application is either setting rows to something different, or not setting it at all and using the default value of 10. If you set the rows parameter in your application to 30, matching what the web tool is doing, I would expect the results to then be consistent.
There is more background about the rows parameter here : https://www.ibm.com/watson/developercloud/doc/retrieve-rank/training_data.shtml

Related

Salesforce deploy Apex Class to production 0% code coverage

I am using Salesforce and I want to deploy a custom Apex Class from my sandbox. In production there is no Apex Classes and the estimated code coverage is 0% so when I try to deploy my class I get the following error
Is there a way to deploy my class ?
The Class I want to deploy is here:
Public class AutoConvertLeads
{
#InvocableMethod
public static void LeadAssign(List<Id> LeadIds)
{
List<Database.LeadConvert> MassLeadconvert = new List<Database.LeadConvert>();
for(id currentlead: LeadIds){
Database.LeadConvert Leadconvert = new Database.LeadConvert();
Leadconvert.setLeadId(currentlead);
Leadconvert.setConvertedStatus('Qualified');
MassLeadconvert.add(Leadconvert);
}
if (!MassLeadconvert.isEmpty()) {
List<Database.LeadConvertResult> lcr = Database.convertLead(MassLeadconvert);
}
}
}
Test Class:
#isTest
Private class UnitTest_AutoConvert
{
Static TestMethod void AutoConvert()
{
// Create the Lead object
Lead testLead = new Lead(
FirstName='Demo 100800',
LastName = 'Demo 100800 UnitTest',
Status='Qualified',
company='Lacosta'
);
insert testLead;
test.StartTest();
List<Lead> lstOfLeadids = [ testLead.Id ]
AutoConvertLeads.LeadAssign(lstOfLeadIds)
test.stopTest();
}
}
In order to meet the production deployment requirements you must meet the testing requirements. At a basic level, this means that you must maintain 75% line coverage between your production code and your test classes. This is at the aggregate level - so you can have some Apex classes with more or less coverage, but it must be 75% of all of code. Additionally, all Apex triggers require at least 1 line of test coverage to pass testing.
Unfortunately, you have provided limited information in your question. It would be helpful if you could provide the code for your test class so we could determine why Salesforce is not executing your tests during deployment. My initial guess is that you have not decorated your test class correctly for Salesforce to know it is a test class.
If you want a friendly introduction to testing, try the testing Trailhead: https://trailhead.salesforce.com/en/content/learn/modules/apex_testing
Take a look at the documentation as Svatopluk recommended. Specifically make sure that following things are happening:
1) The test class is marked as "#isTest"
2) The test method within the class is marked as "#isTest" or "testMethod" in the declaration.
3) The test class actually instantiates and runs code within your target class.
4) Deploy the TargetClass and TestClass in the same change set - this is so Salesforce can actually execute the tests during deployment.
Here is an example block:
#isTest
public class TestTargetClass{
public static testMethod void TestExectuableMethod() {
Test.startTest();
TargetClass instance_tc = new TargetClass();
instance_tc.executable_method();
Test.stopTest();
System.assert(<some sort of test to confirm that your TargetClass operates correctly>);
}
}
EDIT BASED ON POSTED TEST CODE:
Your test code has a number of issues.
First, it doesn't compile so I am not sure how you were able to get a passed test.
Lets review the errors in the following block:
test.StartTest();
List<Lead> lstOfLeadids = [ testLead.Id ]
AutoConvertLeads.LeadAssign(lstOfLeadIds)
test.stopTest();
The second line lstOfLeadids is of Type List of Lead but you are trying to populated it with an Id rather than a Lead.
This needs to be a List of Id since AutoConvertLeads.LeadAssign takes a List of Ids as the parameter.
Your instantiation of the lstOfLeadids is also wrong.
You are missing two semicolons.
Please use the following code:
test.StartTest();
List<Id> lstOfLeadids = new List<Id>{ testLead.Id };
AutoConvertLeads.LeadAssign(lstOfLeadIds);
test.stopTest();
In your actual AutoConvertLeads class, you are setting the lead convesion status to "Qualified". This didn't work on my Sandbox, but maybe it will on yours. You should be querying for the MasterLabel on the LeadStatus object of an IsConverted record to get the correct value.
You need to write test class to your class to be able to move it to production.
You can find basic explanation here

Bigdecimal parsed to Double in Properties?

I'm rewriting the core of one of my apps, and one of the major change is migrating my entities to PropertyBusinessObjects.
I've coded a little tool to write PropertyBusinessObjects from my server side JPAEntities to limit the time taken by stupid copy pasting and leverage my workload, so nearly all my CN1 entities are rewritten to PBO.
In order to not rewrite all of the code which was using classic getters/setters, I've added the creation of pseudo getter/setters to my generation code to obtain this kind of result :
protected Property<String, Product> reference = new Property<>("reference");
public String getReference() {
return this.reference.get();
}
public void setReference(String reference) {
this.reference.set(reference);
}
The result is nearly perfect, but I've run into some troubles when it comes to BigDecimal. Our app is an ERP client (mainly a consultation app which is combined with a much bigger webapp), so when it come to price values and so on, we need high precision, which lead us to BigDecimals years ago.
When I retrieve my entities from the server, everything goes well, all is read by the getAsProperties from the RequestBuilder without any exceptions. But when it goes through my "getter", the call throws a ClassCastException. It appears that the parsed value for the BigDecimals are Doubles, so it sets my Property<BigDecimal, Product> with a Double value instead of a BigDecimal which later cause ClassCastExceptions.
Here is an exemple of BigDecimal property and its getter/setter :
protected Property<BigDecimal, Product> priceBuy = new Property<>("priceBuy", BigDecimal.class);
public BigDecimal getPriceBuy() {
return this.priceBuy.get();
}
public void setPriceBuy(BigDecimal priceBuy) {
this.priceBuy.set(priceBuy);
}
Any idea or leads to resolve this matter ?
There is no logic for parsing/placing BigDecimal or BigInteger in properties. This might be something we should add in the future, however as a workaround we have a generic extension mechanism that lets you customize this code.
Haven't tried this but it should generally work:
MapAdapter m = new MapAdapter(BigDecimal.class) {
public void placeInMap(PropertyBase b, Map m) {
// this might be unnecessary
m.put(b.getName(), b.get());
}
public void setFromMap(PropertyBase b, Map m){
long d = (long)(m.get(b.getName()) * 10000);
b.setImpl(new BigDecimal(new BigInteger(d), 5));
}
};

New to AutoFixture trying to get my head around it and I can't see it helping me

Currently, I'm using custom made fake objects that behind the scenes use NSubstitute which creates the actual objects but it's becoming very hard to maintain as the project grows, so I'm trying to find alternatives and I'm hoping that AutoFixture is the right tool for the job.
I read the documentation and I'm struggling because there's very little to no documentation and I read most of the blog posts by Mark Seemann including the CheatSheet.
One of the things that I'm having hard time to grasp is how to create an object with a constructor that have parameters, in my case I need to pass argument to CsEmbeddedRazorViewEngine as well as HttpRequestBase to ControllerContext.
The way I see it is that I need to create a fake objects and finally create a customization object that injects them to
I also looked into NBuilder it seems slightly more trivial to pass arguments there but I've heard good things about AutoFixture and I would like to give it a try. :)
I'm trying to reduce the amount of fake objects I have so here is a real test, how can I do the same thing with AutoFixture?
[Theory,
InlineData("en-US"),
InlineData("en-us"),
InlineData("en")]
public void Should_return_the_default_path_of_the_view_for_enUS(string language)
{
// Arrange
const string EXPECTED_VIEW_PATH = "~/MyAssemblyName/Views/Home/Index.cshtml";
CsEmbeddedRazorViewEngine engine = CsEmbeddedRazorViewEngineFactory.Create(ASSEMBLY_NAME, VIEW_PATH, string.Empty);
string[] userLanguage = { language };
HttpRequestBase request = FakeHttpRequestFactory.Create(userLanguage);
ControllerContext controllerContext = FakeControllerContextFactory.Create(request);
// Act
ViewEngineResult result = engine.FindPartialView(controllerContext, VIEW_NAME, false);
// Assert
RazorView razorView = (RazorView)result.View;
string actualViewPath = razorView.ViewPath;
actualViewPath.Should().Be(EXPECTED_VIEW_PATH);
}
P.S. I'm using xUnit as my testing framework and NSubstitute as my mocking framework should I install both AutoFixture.Xunit and AutoFixture.AutoNSubstitute?
UPDATE: After learning more and more about it I guess it is not the right tool for the job because I tried to replace my test doubles factories with AutoFixture rather than setting up my SUT with it.
Due to odd reason I thought it's doing the same thing NBuilder is doing and from what I can see they are very different tools.
So after some thinking I think I'll go and change the methods I have on my test doubles factories to objects then use AutoFixture to create my SUT and inject my test doubles to it.
Note: I don't have the source code for the CsEmbeddedRazorViewEngine type and all the other custom types.
Here is how it could be written with AutoFixture:
[Theory]
[InlineAutoWebData("en-US", "about", "~/MyAssemblyName/Views/Home/Index.cshtml")]
[InlineAutoWebData("en-US", "other", "~/MyAssemblyName/Views/Home/Index.cshtml")]
public void Should_return_the_default_path_of_the_view_for_enUS(
string language,
string viewName,
string expected,
ControllerContext controllerContext,
CsEmbeddedRazorViewEngine sut)
{
var result = sut.FindPartialView(controllerContext, viewName, false);
var actual = ((RazorView)result.View).ViewPath;
actual.Should().Be(expected);
}
How it works:
It uses AutoFixture itself together with it's glue libraries for xUnit.net and NSubstitute:
PM> Install-Package AutoFixture.Xunit
PM> Install-Package AutoFixture.AutoNSubstitute
With InlineAutoWebData you actually combine inline values and auto-generated data values by AutoFixture – also including Auto-Mocking with NSubstitute.
internal class InlineAutoWebDataAttribute : CompositeDataAttribute
{
internal InlineAutoWebDataAttribute(params object[] values)
: base(
new InlineDataAttribute(values),
new CompositeDataAttribute(
new AutoDataAttribute(
new Fixture().Customize(
new WebModelCustomization()))))
{
}
}
Remarks:
You could actually replace the WebModelCustomization customization above with AutoNSubstituteCustomization and it could work.
However, assuming that you are using ASP.NET MVC 4, you need to customize the Fixture instance with:
internal class WebModelCustomization : CompositeCustomization
{
internal WebModelCustomization()
: base(
new MvcCustomization(),
new AutoNSubstituteCustomization())
{
}
private class MvcCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
fixture.Customize<ControllerContext>(c => c
.Without(x => x.DisplayMode));
// Customize the CsEmbeddedRazorViewEngine type here.
}
}
}
Further reading:
Encapsulating AutoFixture Customizations
AutoData Theories with AutoFixture
I ended up doing this.
[Theory,
InlineData("en-US", "Index", "~/MyAssemblyName/Views/Home/Index.cshtml"),
InlineData("en-us", "Index", "~/MyAssemblyName/Views/Home/Index.cshtml"),
InlineData("en", "Index", "~/MyAssemblyName/Views/Home/Index.cshtml")]
public void Should_return_the_default_path_of_the_view(string language, string viewName, string expected)
{
// Arrange
CsEmbeddedRazorViewEngine engine = new CsEmbeddedRazorViewEngineFixture();
ControllerContext controllerContext = FakeControllerContextBuilder.WithLanguage(language).Build();
// Act
ViewEngineResult result = engine.FindPartialView(controllerContext, viewName, false);
// Assert
string actualViewPath = ((RazorView)result.View).ViewPath;
actualViewPath.Should().Be(expected);
}
I encapsulated the details to setup my SUT into a fixture and used the builder pattern to handle my fakes, I think that it's readable and pretty straightforward now.
While AutoFixture looks pretty cool, the learning curve seems long and I will need to invest enough time to understand it, for now, I want to clean-up my unit tests and make them more readable. :)

Is there a #visibility package concept in PHPDoc / PHPStorm?

I have a domain model written in PHP, and some of my classes (entities inside an aggregate) have public methods, which should never be called from outside the aggregate.
PHP does not have the package visibility concept, so I'm wondering if there is some kind of standardized way to define #package and #visibility package in the docblocks, and to have a static analysis tool that would report violations of the visibility scope.
I'm currently trying out PHPStorm, which I've found very good so far, so I'm wondering if this software has support for this feature; if not, do you know any static code analysis tool that would?
The closest parallel to this line of thinking that I see in PHP's capability is using "protected" scope rather than public for these kinds of methods. Granted, that requires using inheritance to grant access to the protected items. In my years of managing phpDocumentor, I've never encountered anything else that attempts to mimic that kind of "package scope" that I remember from my Java days.
If the entities within your aggregate root should not be modifiable without going through the aggregate root, then the only means you have to control that is making the entity a private or protected member so that all modifications to the entity have to go through the aggregate.
class RootEntity {
private $_otherEntity;
public function DoSomething() {
$this->_otherEntity->DoSomething();
}
public function setOtherEntity( OtherEntity $entity ) {
$this->_otherEntity = $entity;
}
}
Someone can still always do:
$otherEntity = new OtherEntity();
$otherEntity->DoSomethingElse();
$rootEntity->setOtherEntity($otherEntity);
Though, I guess you could use the magic __call() method to prohibit setting of the _otherEntity anywhere except during construction. This falls under total hack category :)
class RootEntity {
private $_otherEntity;
private $_isLoaded = false;
public function __call( $method, $args ) {
$factoryMethod = 'FactoryOnly_'.$method;
if( !$this->_isLoaded && method_exists($this,$factoryMethod) {
call_user_func_array(array($this,$factoryMethod),$args
}
}
public function IsLoaded() {
$this->_isLoaded = true;
}
protected function FactoryOnly_setOtherEntity( OtherEntity $otherEntity ) {
$this->_otherEntity = $otherEntity;
}
}
So, from there, when you build the object, you can call $agg->setOtherEntity($otherEntity) from your factory or repository. Then when you are done building the object, call IsLoaded(). From there, nobody else will be able to introduce a new OtherEntity into the class and will have to use the publicly available methods on your aggregate.
I'm not sure if you can call that a "good" answer, but it's the only thing I could think of to truly limit access to an entity within an aggregate.
[EDIT]: Also, forgot to mention...the closest for documentation is that there is an #internal for phpdoc:
http://www.phpdoc.org/docs/latest/for-users/tags/internal.html
I doubt that it will modify the IDE's code completion, however. Though, you could probably make a public function/property but label it as "#access private" with phpdoc to keep it from being in code completion.
So far, PHPStorm does not seem to provide this feature.

unit test to verify that a repository loads an entity from the database correctly

I have a simple standard repository that loads a composite entity from the database. It injects all dependencies it need to read the complete entity tree from a database through IDbConnection (wich gives the repository access to IDbCommand, IDbTransaction, IDataReader) that I could mock.
public class SomeCompositionRootEntityRepository :
IRepository<SomeCompositionRoot>
{
public RecipeRepository(IDbConnection connection) { ... }
public void Add(SomeCompositionRootEntity item) { ... }
public bool Remove(SomeCompositionRootEntity item) { ... }
public void Update(SomeCompositionRootEntity item) { ... }
public SomeCompositionRootEntity GetById(object id) { ... }
public bool Contains(object id) { ... }
}
The question is how would I write unit test for this in a good way? If I want to test that the reposity has read the whole tree of objects and it has read it correcty, I would need to write a hughe mock that records and verifies the read of each and every property of each and every object in the tree. Is this really the way to go?
Update:
I think I need to refactor my repository to break the repository functionality and unit test into smaller units. How could this be done?
I am sure I do not want to write unit test that involve reading and writing from and to an actual database.
The question is: What functionality do you want to test?
Do you want to test that your repository actually loads something? In this case I would write a few (!) tests that go through the database.
Or do you want to test the functionality inside the repository methods? In this case your mock approach would be appropriate.
Or do you want to make sure that the (trivial) methods of your repository aren't broken? In this case mocks and one test per method might be sufficient.
Just ask yourself what the tests shall ensure and design them along this target!
I think I understand your question so correct me if I'm wrong...
This is a where you cross the line from unit to integration. The test makes sense (I've written these myself), but you're not really testing your repository, rather you're testing that your entity (SomeCompositionRoot) maps correctly. It isn't inserting/updating, but does involve a read to the database.
Depending on what ORM you use, you can do this a million different ways and typically its fairly easy.
::EDIT::
like this for linq for example ...
[TestMethod]
public void ShouldMapBlahBlahCorrectly()
{
CheckBasicMapping<BlahBlah>();
}
private T CheckBasicMapping<T>() where T : class
{
var target = _testContext.GetTable<T>().FirstOrDefault();
target.ShouldNotBeNull();
return target;
}

Resources